zoukankan      html  css  js  c++  java
  • ptypes中string类的空间分配

    问题描述:

               在学习ptypes中string类的空间分配时,经常使分配的空间超出实际所需的空间

    使用的分配函数是:_alloc函数

    alloc

    注:

           在_alloc函数中调用了quantize(numchars)函数确定分配空间的大小

    quantize函数的代码如下:

    quantize

            在quantize函数中调用memquantize函数如下:

    memquantize

          注:

                在使用quantize函数确定分配空间的时候,我们总是按照大小为 numchars+1+strrecsize

                 的初始值调用memquantize函数,其中strrecsize的定义如下:

    strrecsize

                 其值为结构体_strrec 的大小:

    _strrec

                其中包含了string中字符的个数length和引用string的个数refcount

                在使用string过程中,定义如下宏来处理_strrec信息:

    base

               注:

                    其中STR_BASE(x)     (_pstrrec(x)-1)       的宏定义很奇妙,将x强制转换为_strrec 结构体指针

                    -1的操作是为了在string 类中char *data指向地址的前一个_strrec空间。

                   在实际中经常见到如下调用:

    data

                  其中data为char *指针,指向地址为分配空间的首地址+strrecsize

                  而STR_LENGTH(data)调用则将length和refcount信息写入data之前的strrecsize结构体空间中。

    问题解决:

            quantize函数分配空间的含义如下:

    quantize

    运行结果如下:

    result

    根据以上结果的分析:

                ~63=1111...1110000000  & (a+63)

               a在32-64的时候quantize(a+63)值为64

               a在65-128的时候quantize(a+63)的值为128

               。。。

  • 相关阅读:
    OpenCV4Android——No implementation found for native Lorg/opencv/core/Mat;.n_Mat ()J
    The method onClick(View) of type new View.OnClickListener(){} must override a superclass
    Android与OpenCV——重新下载安装和OpenCV匹配的Android开发环境
    45_拍照
    32_文件断点上传器
    31_多线程断点下载器
    Eclipse的Servers视图中无法添加Tomcat
    23_网络通信之网络图片查看器
    C语言 · 时间转换
    C语言 · 4_2找公倍数
  • 原文地址:https://www.cnblogs.com/luosongchao/p/3408376.html
Copyright © 2011-2022 走看看