美文网首页IT狗工作室Python中文社区视觉艺术
第3篇:CPython实现原理:字符串对象

第3篇:CPython实现原理:字符串对象

作者: 铁甲万能狗 | 来源:发表于2020-07-08 17:51 被阅读0次

    在CPython3.3之后,字符串对象发生了根本性的变法,本篇我们来讨论一下字符串对象,在Include/unicodeobject.h,在整个源代码的官方文档可以归纳出几点。在CPython3.3+之后,Unicode字符串分为有4种

    紧凑型ASCII(Compact ASCII)

    其对应PyASCIIObject结构体,该对象使用一个空间连续的内存块(一个内部的state结构体和一个wchar_t类型的指针),紧凑型ASCII只能涵盖拉丁编码以内的字符。ASCII字符限定意味着PyASCIIObject只能U+0000 ~ U+007F这段区间的字符码。

    typedef struct {
        PyObject_HEAD
        Py_ssize_t length;          /* Number of code points in the string */
        Py_hash_t hash;            /* Hash value; -1 if not set */
        struct {
            unsigned int interned:2;
            unsigned int kind:3;
            unsigned int compact:1;
            unsigned int ascii:1;
            unsigned int ready:1;
            unsigned int :24;
        } state;
    
       wchar_t *wstr;              /* wchar_t representation (null-terminated) */
    } PyASCIIObject;
    

    紧凑型Unicode(Compact Unicode)

    其对应PyCompactUnicodeObject结构体,紧凑型Unicode以PyASCIIObject为基类,非ASCII字符(即一个字节大小的字符)会保存到PyCompactUnicodeObject当中,若表示非ASCII字符串可以通过PyUnicode_New函数为PyCompactUnicodeObject分配内存并设置state.compact=1

    typedef struct {
        PyASCIIObject _base;
        Py_ssize_t utf8_length;     /* Number of bytes in utf8, excluding the
                                     * terminating \0. */
        char *utf8;                 /* UTF-8 representation (null-terminated) */
        Py_ssize_t wstr_length;     /* Number of code points in wstr, possible
                                     * surrogates count as two code points. */
    } PyCompactUnicodeObject;
    

    传统的字符串(Legacy String)

    其对应PyUnicodeObject结构体,传统的字符串对象会其中会包含两种特殊状态not ready和ready。

    通过PyUnicode_FromUnicode(NULL,len)分配的字符串使用PyUnicodeObject结构体来封装C底层的字符串。 实际的字符串数据最初位于wstr块中,并使用_PyUnicode_Ready复制到数据块中。

    typedef struct {
        PyCompactUnicodeObject _base;
        union {
            void *any;
            Py_UCS1 *latin1;
            Py_UCS2 *ucs2;
            Py_UCS4 *ucs4;
        } data;                     /* Canonical, smallest-form Unicode buffer */
    } PyUnicodeObject;
    

    更新中.....

    相关文章

      网友评论

        本文标题:第3篇:CPython实现原理:字符串对象

        本文链接:https://www.haomeiwen.com/subject/jpcccktx.html