上一篇的整数对象是定长数据,即C中的long型整数。 但是python中还大量存在着不定长的数据类型。如字符串对象
和整数对象一样,字符串对象的组成如下:
PyStringObject定义如下:
Ob_size就是实际使用的内存大小,在注释中:ob_sval contains space for ‘ob_size+1‘ elements. 因为末尾需要额外包含一个0 byte来保证字符串的结束。 这个学过C语言的应该都不会陌生的。但是这只是一个字符数组,怎么能包含N个字符呢? 显然这只能是一个字符指针,指向一个字符串内存地址。这个字符串内存存储的就是python字符串对象的字符内容,显然额外包含一个‘0’。这个内存的实际大小就是由Ob_size+1来维护的。
PyString_Type的定义就不在贴代码了,格式基本上和整数对象一样。
创建PyStringObject对象
PyStringObject对象的创建不像整数对象最终都调用的类似一个函数PyInt_FromLong。那么字符串会像整数对象那样会有缓存池么?在PyString_FromString函数中,原作者加了注释/* share short strings */。当字符只有1个的时候,会放进characters中。这个缓存区的大小是UCHAR_MAX。很显然这是平台相关的宏定义。
从他的声明中,可以知道characters是一个static变量。按照C语言的做法,Python完成初始化后,characters应该被初始化为空的指针数组。Follow之前整数对象的打印操作。 我们打印characters最后5位以及其分别的引用数
写这个函数的时候,按照书上返回void,编译就会失败,必须返回int才可以
可以看到a的引用计数增加,的确是放在字符数组中共享使用