ptypes中string类的空间分配
问题描述:
在学习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类的空间分配的更多相关文章
- Java中String类的方法及说明
		String : 字符串类型 一. String sc_sub = new String(c,3,2); // String sb_copy = new String(sb) ... 
- JDK6与JDK7中String类subString()方法的区别
		1.subString()方法的作用 subString(int beginIndex, int endIndex)方法的返回的是以beginIndex开始到 endIndex-1结束的某个调用字符串 ... 
- java中String类学习
		java中String类的相关操作如下: (1)初始化:例如,String s = “abc”; (2)length:返回字符串的长度. (3)charAT:字符操作,按照索引值获得字符串中的指定字符 ... 
- c++中string类的详解
		,<时返回-1,==时返回0 string的子串:string substr(int pos = 0,int n = npos) const;//返回pos开始的n个字符组成的字符串strin ... 
- 标准C++中string类的用法
		转自博客园:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用过MFC编程的朋友对CString这个类的印象应该非 ... 
- c++中string类的具体解释
		通过在站点上的资料搜集,得到了非常多关于string类使用方法的文档,通过对这些资料的整理和增加一些自己的代码,就得出了一份比較完整的关于string类函数有哪些和如何用的文档了! 以下先罗列出str ... 
- 关于Java中String类的hashCode方法
		首先来看一下String中hashCode方法的实现源码 public int hashCode() { int h = hash; if (h == 0 && value.lengt ... 
- 在java中String类为什么要设计成final
		在java中String类为什么要设计成final? - 胖胖的回答 - 知乎 https://www.zhihu.com/question/31345592/answer/114126087 
- 【转载】Java中String类的方法及说明
		转载自:http://www.cnblogs.com/YSO1983/archive/2009/12/07/1618564.html String : 字符串类型 一. String sc_ ... 
随机推荐
- 反编译工具(.NET Reflector )
			1.下载安装原程序,然后运行 Reflector.exe 2.运行注册机,点击 Generate 获得序列号 3.把序列号填写到 Reflector 软件上4.断开网络,点击 Activate 激活( ... 
- jQuery中ajax调用当前页面方法
			$.ajax({ type: 'POST', url: 'AddressManager.aspx/GetProvince',//AddressManager.aspx当前页面 data: '{cach ... 
- Nginx配置:http重定向,URLRewrite,一个简单框架的配置思路
			一个重定向的应用配置: server { listen 8000; server_name localhost; root F:/home/projects/test; index ... 
- Service(一)----->简单计算
			xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ... 
- C-链表的一些基本操作【创建-删除-打印-插入】
			#include <stdio.h> #include <stdlib.h> #include <malloc.h> #define LEN sizeof(stru ... 
- DXperience重编译汉化的方法
			1. 必须有DXperience相应版本的全部源代码SourceCode.把全部源代码复制到\Program Files\Developer Express .NET vX.X\Sources目录.目 ... 
- SIMATIC IT HISTORIAN在烟用二醋酸纤维素生产中应用
			原文转载自:http://www.soft6.com/tech/5/54287.html 本文介绍了西门子MES核心产品SIMATIC IT HISTORIAN实时数据库及客户端工具在流程生产中的具体 ... 
- UCOS2_STM32F1移植详细过程(一)
			Ⅰ.概述 该文写针对初学µC/OS的朋友,基于以下平台来一步一步移植µC/OS嵌入式操作系统.UCOS移植相关平台: 系统平台:µC/OS-II (最新V2.92版) 硬件平台:STM32F1 ... 
- iphone/ipad关于size, frame and bounds总结和UIScroll view学习笔记
			1. iphone/ipad大小 Device Screen dimensions(in points) iphone and ipod 320 X 480 ipad 768 X 1024 2. UI ... 
- 菜鸟学习Hibernate——配置Hibernate环境
			一.概念. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库.既然学习Hibernate那么第 ... 
