问题描述:

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

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

注:

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

quantize函数的代码如下:

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

      注:

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

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

             其值为结构体_strrec 的大小:

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

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

           注:

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

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

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

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

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

问题解决:

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

运行结果如下:

根据以上结果的分析:

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

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

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

           。。。

ptypes中string类的空间分配的更多相关文章

  1. Java中String类的方法及说明

    String : 字符串类型 一.      String sc_sub = new String(c,3,2);    //      String sb_copy = new String(sb) ...

  2. JDK6与JDK7中String类subString()方法的区别

    1.subString()方法的作用 subString(int beginIndex, int endIndex)方法的返回的是以beginIndex开始到 endIndex-1结束的某个调用字符串 ...

  3. java中String类学习

    java中String类的相关操作如下: (1)初始化:例如,String s = “abc”; (2)length:返回字符串的长度. (3)charAT:字符操作,按照索引值获得字符串中的指定字符 ...

  4. c++中string类的详解

    ,<时返回-1,==时返回0  string的子串:string substr(int pos = 0,int n = npos) const;//返回pos开始的n个字符组成的字符串strin ...

  5. 标准C++中string类的用法

    转自博客园:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用过MFC编程的朋友对CString这个类的印象应该非 ...

  6. c++中string类的具体解释

    通过在站点上的资料搜集,得到了非常多关于string类使用方法的文档,通过对这些资料的整理和增加一些自己的代码,就得出了一份比較完整的关于string类函数有哪些和如何用的文档了! 以下先罗列出str ...

  7. 关于Java中String类的hashCode方法

    首先来看一下String中hashCode方法的实现源码 public int hashCode() { int h = hash; if (h == 0 && value.lengt ...

  8. 在java中String类为什么要设计成final

    在java中String类为什么要设计成final? - 胖胖的回答 - 知乎 https://www.zhihu.com/question/31345592/answer/114126087

  9. 【转载】Java中String类的方法及说明

    转载自:http://www.cnblogs.com/YSO1983/archive/2009/12/07/1618564.html String : 字符串类型 一.      String sc_ ...

随机推荐

  1. HTML5 对于手机页面长按会粘贴复制的禁用 (解决方案)

    解决方案: 直接在CSS 文件中添加下面的代码,就可以实现了在手机端禁止粘贴复制的功能: *{    -webkit-touch-callout:none;  /*系统默认菜单被禁用*/    -we ...

  2. 分析MapReduce执行过程

    分析MapReduce执行过程 MapReduce运行的时候,会通过Mapper运行的任务读取HDFS中的数据文件,然后调用自己的方法,处理数据,最后输出. Reducer任务会接收Mapper任务输 ...

  3. dedecms5.7 联动类型无法显示

    dedecms5.7 联动类型无法显示 问题原因:一般是由于路径问题( 路径缺少分隔符'/' )导致js无法正常加载 如果遇到该类问题,尝试通过firebug工具检查js是否被正确加载. 如果是路径问 ...

  4. C++求斐波那契数

    题目内容:斐波那契数定义为:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)(n>1且n为整数) 如果写出菲氏数列,则应该是: 0 1 1 2 3 5 8 13 21 34 …… ...

  5. Delphi For Android 开发笔记 2 NEXTGEN下的字符串类型

    delphi开发速度迅捷至少有30%(猜的,呵呵)的原因是因为其字符串(string.WideString.PChar.PAnsiChar等)处理能力. 而从delphi XE4开始,在system等 ...

  6. js控制div动起来

    代码: <html> <head> <title>让div动的测试</title> <script language="javascri ...

  7. C#高级功能(三)Action、Func,Tuple

    Action和Func泛型委托实际上就是一个.NET Framework预定义的委托,3.5引入的特性.基本涵盖了所有常用的委托,所以一般不用用户重新声明. Action系列泛型委托,是没有返回参数的 ...

  8. python学习第二天第一部分

    备注:写程序不能写重复性的代码 学习内容:数据类型.for循环.while循环.字符编码.文件处理 一.for循环 1.简单的for循环 for i in range(10): # 此处意思为:循环r ...

  9. JavaScript高级程序设计之原型对象

    构造函数.原型对象.构造器是一体的关系,同时产生: 实例中的隐藏属性__proto__指向原型对象: 原型对象是这四种关系的纽带. 原型对象是动态的,不论在何处变化,实例中可以立即体现出来. var ...

  10. iOS学习之界面通信

    一.属性传值 在SecondViewController.h里 #import <UIKit/UIKit.h> @interface SecondViewController : UIVi ...