PyStringObject
定义
typedef struct {
PyObject_VAR_HEAD //字符串是变长对象,所以有变长对象头
long ob_shash; //ob_shash用来缓存当前字符串的哈希值,这在以字符串作为key的dict对象查询时非常有用。
int ob_sstate; //ob_sstate用来标记该字符串是否为interned。
char ob_sval[1];
/* Invariants:
* ob_sval contains space for 'ob_size+1' elements.
* ob_sval[ob_size] == 0.
* ob_shash is the hash of the string or -1 if not computed yet.
* ob_sstate != 0 iff the string object is in stringobject.c's
* 'interned' dictionary; in this case the two references
* from 'interned' to this object are *not counted* in ob_refcnt.
*/
} PyStringObject;
说明
- PyObject_VAR_HEAD
PyStringObject是变长对象, 比定长对象多了一个ob_size字段- ob_shash
存储字符串的hash值, 如果还没计算等于-1
当string_hash被调用, 计算结果会被保存到这个字段一份, 后续不再进行计算
用来缓存当前字符串的哈希值,这在以字符串作为key的dict对象查询时非常有用。- ob_sstate
如果是interned, !=0, 否则=0
interned后面说- char ob_sval[1]
这个ob_sval比较巧妙,定义的是一个字符的数组,他的作用其实是作为实际分配内存后,字符串缓冲区的指针。在实际给字符串对象分配内存时,Python申请的内存大小为PyStringObject + 字符串长度。字符指针指向一段内存, char数组指针, 指向一个ob_size+1大小数组(c中字符串最后要多一个字符\0
表字符串结束)
构造方法 PyString_FromString
//默认未初始化, 均为NULL
static PyStringObject *characters[UCHAR_MAX + 1];
static PyStringObject *nullstring;
PyObject *
PyString_FromString(const char *str)
{
register size_t size;