python 字符串对象 底层实现 源码分析 str/unicode

str

以后都在 github 更新,请戳 cpython str/unicode 底层实现解析

目录

相关位置文件
  • cpython/Objects/unicodeobject.c
  • cpython/Include/unicodeobject.h
  • cpython/Include/cpython/unicodeobject.h
内存构造

layout

如果你对 c 语言的 bit-fields 有疑问,请参考 When to use bit-fields in C?“:” (colon) in C struct - what does it mean?

字符串转换

在我们深入的看 unicod 对象如何创建,调整空间之前,我们先来看下 PyUnicode_AsUTF8 这个 c 函数

/*
   每当我需要在 cpython 里面尝试把 一个 PyObject 转换成 const char* 指针时,我会调用这个函数
   const char *s = PyUnicode_AsUTF8(py_object_to_be_converted)
   我们来看看这个函数的定义
*/
const char *
PyUnicode_AsUTF8(PyObject *unicode)
{
	return PyUnicode_AsUTF8AndSize(unicode, NULL);
}

/* 找到 PyUnicode_AsUTF8AndSize 这个函数 */
const char *
PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *psize)
{
    PyObject *bytes;

	/* 开始之前会做一些边界检查,先忽略这部分检查 */
    /* PyUnicode_UTF8 检查 unicode 对象的 compact flag, 并根据这个 flag 返回一个指向 char 的指针,看下图 */

    if (PyUnicode_UTF8(unicode) == NULL) {
        assert(!PyUnicode_IS_COMPACT_ASCII(unicode));
        /* bytes 的类型是 PyBytesObject,bytes 一共可以有4种不同的可能,详见下图 */
        bytes = _PyUnicode_AsUTF8String(unicode, NULL);
        if (bytes == NULL)
            return NULL;
        /* 把
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值