深入理解 Python 虚拟机:字节(bytes)的实现原理及源码剖析
在本篇文章当中主要给大家介绍在 cpython 内部,bytes 的实现原理、内存布局以及与 bytes 相关的一个比较重要的优化点—— bytes 的拼接。
数据结构
typedef struct {
PyObject_VAR_HEAD
Py_hash_t ob_shash;
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.
*/
} PyBytesObject;
typedef struct {
PyObject ob_base;
Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;
typedef struct _object {
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
} PyObject;
上面的数据结构用图示如下所示:
现在我们来解释一下上面的数据结构各个字段的含义:
- ob_refcnt,这个还是对象的引用计数的个数,主要是在垃圾回收的时候有用。
- ob_type,这个是对象的数据类型。
- ob_size,表示这个对象当中字节的个数。
- ob_shash,对象的哈希值,如果还没有计算,哈希值为 -1 。
- ob_sval,一个数据存储一个字节的数据,需要注意的是 ob_sval[size] 一定等于 ‘