《Python源码剖析》之 str

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;

说明

  1. PyObject_VAR_HEAD
    PyStringObject是变长对象, 比定长对象多了一个ob_size字段
  2. ob_shash
    存储字符串的hash值, 如果还没计算等于-1
    当string_hash被调用, 计算结果会被保存到这个字段一份, 后续不再进行计算
    用来缓存当前字符串的哈希值,这在以字符串作为key的dict对象查询时非常有用。
  3. ob_sstate
    如果是interned, !=0, 否则=0
    interned后面说
  4. 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;
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值