ptypes中string类的空间分配

时间:2021-06-11 23:00:38

问题描述:

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

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

ptypes中string类的空间分配

注:

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

quantize函数的代码如下:

ptypes中string类的空间分配

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

ptypes中string类的空间分配

      注:

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

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

ptypes中string类的空间分配

             其值为结构体_strrec 的大小:

ptypes中string类的空间分配

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

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

ptypes中string类的空间分配

           注:

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

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

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

ptypes中string类的空间分配

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

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

问题解决:

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

ptypes中string类的空间分配

运行结果如下:

ptypes中string类的空间分配

根据以上结果的分析:

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

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

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

           。。。