主题:SStringT里的_tstr_rgInitData是干什么用的?

admin 2018年12月08日 138
static int _tstr_rgInitData[] = { -1, 0, 0, 0, 0, 0, 0, 0 };

TStringData* _tstr_initDataNil = (TStringData*)&_tstr_rgInitData;
const void* _tstr_initPszNil = (const void*)(((unsigned char*)&_tstr_rgInitData) + sizeof(TStringData));


最近好几个人问到这SStringT里这个数组是用来做什么的。 

其实很简单,就是分配一个空SStringT占用的内存。 

每一个SStringT在内存中都是以一个TStringData*对象存在的。


struct TStringData
    {
        long nRefs;            // Reference count: negative == locked
        int nDataLength;    // Length of currently used data in XCHARs (not including terminating null)
        int nAllocLength;    // Length of allocated data in XCHARs (not including terminating null)
//...
};

从上面定义可以看到TStringData有3个int类型的元素。 

TStringData对象后面接着的是真实的字符串数据。 

因此所有指向_tstr_rgInitData的字符串都实际上就是一个空字符串。

 为什么要分配这样一个空字符串呢?空字符串可能是最经常用到的字符串,如果没有这样一个数据,每一个空串都需要分配一个新的TStringData对象,容易导致内存碎片化,同时效率也更低。