1 / 7
文档名称:

Python源码剖析.doc.doc

格式:doc   页数:7页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Python源码剖析.doc.doc

上传人:mplytg 2015/5/10 文件大小:0 KB

下载得到文件列表

Python源码剖析.doc.doc

文档介绍

文档介绍:Python源码剖析
——字符串对象PyStringObject(2)
本文作者: Robert Chen(@ )
3.      Intern机制
无论是PyString_FromString还是PyString_FromStringAndSize,我们都注意到,当字符数组的长度为0或1时,需要进行了一个特别的动作:PyString_InternInPlace。这就是前面所提到的Intern机制。
PyStringObject对象的Intern机制其目的是对于被Intern之后的字符串,在整个Python运行时,系统中都只有唯一的与该字符串对应的PyStringObject对象。这样当判断两个PyStringObject对象是否相同时,如果它们都被Intern了,那么只需要简单地检查它们对应的PyObject*是否相同即可。这个机制既节省了空间,又简化了对PyStringObject对象的比较,嗯,可谓是一箭双雕哇:)
假如在某个时刻,我们创建了一个PyStringObject对象A,其表示的字符串是“Python”,在之后的某一时刻,加入我们想为“Python”再次建立一个PyStringObject对象,通常情况下,Python会为我们重新申请内存,创建一个新的PyStringObject对象B,A与B是完全不同的两个对象,尽管其内部维护的字符数组是完全相同的。
这就带来了一个问题,加入我们在程序中创建了100个“Python”的PyStringObject对象呢?显而易见,这样会大量地浪费珍贵的内存。因此Python对PyStringObject对象引入了Intern机制。在上面的例子中,如果对于A应用了Intern机制,那么之后要创建B的时候,Python会首先在系统中记录的已经被Intern的PyStringObject对象中查找,如果发现该字符数组对应的PyStringObject对象已经存在了,那么就将该对象的引用返回,而不会创建对象B。PyString_InternInPlace正是完成对一个对象的Intern操作:
[]
void PyString_InternInPlace(PyObject **p)
{
    register PyStringObject *s = (PyStringObject *)(*p);
    PyObject *t;
    if (s == NULL || !PyString_Check(s))
        Py_FatalError("PyString_InternInPlace: strings only please!");
    /* If it's a string subclass, we don't really know what putting
       it in the interned dict might do. */
    if (!PyString_CheckExact(s))
        return;
    if (PyString_CHECK_INTERNED(s))
        return;
 
    if (interned