这一章, 就一张图, 代码比较多
PyStringObject
源码位置 Include/stringobject.h |
Objects/stringobject.c
定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
typedef struct { PyObject_VAR_HEAD long ob_shash; int ob_sstate; 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; |
说明
1 2 3 4 5 6 7 8 9 10 11 12 13 |
1. PyObject_VAR_HEAD PyStringObject是变长对象, 比定长对象多了一个ob_size字段 2. ob_shash 存储字符串的hash值, 如果还没计算等于-1 当string_hash被调用, 计算结果会被保存到这个字段一份, 后续不再进行计算 3. ob_sstate 如果是interned, !=0, 否则=0 interned后面说 4. char ob_sval[1] 字符指针指向一段内存, char数组指针, 指向一个ob_size+1大小数组(c中字符串最后要多一个字符``表字符串结束) |
结构
构造方法
1 2 3 |
PyAPI_FUNC(PyObject *) PyString_FromString(const char *); PyAPI_FUNC(PyObject *) PyString_FromStringAndSize(const char *, Py_ssize_t); |
两个构造方法其实区别不大,
1 2 3 |
PyString_FromStringAndSize 参数可以为`NULL`, 无论是否为`NULL`, 都会分配`size+1`个字节空间.(不为NULL的话字符数组会进行拷贝) PyString_FromString, 参数不能为`NULL`, 且必须是``结束的字符数组, 会调用c 语言string.h模块的strlen()函数计算字符串长度, 分配空间, 并将整个字符数组拷贝到ob_sval指向的内存 |
我们关注PyString_FromString
就行
创建过程 PyString_FromString
定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 ta-line="crayon-5812b3c356d59815243318-63">63 64 65 66 67 /h1>
源码位置 Include/stringobject.h | 定义
说明
结构 构造方法
两个构造方法其实区别不大,
我们关注 创建过程 PyString_FromString定义
|