GCC的std :: string - 为什么如此奇怪的实现

时间:2012-05-28 13:22:47

标签: string gcc stl implementation stdstring

当我看到在gcc中实现std :: string的方式时,我注意到sizeof(std :: string)正好等于指针的大小(x32 build中为4个字节,x64为8个字节)。因为字符串应该保存一个指向字符串缓冲区的指针,并且它的长度是最小值,这使我认为GCC中的std :: string对象实际上是指向保存此数据的某个内部结构的指针。

因此,当创建新字符串时,应该发生一个动态内存分配(即使该字符串为空)。

除了性能开销之外,这还会导致内存开销(当我们分配非常小的内存块时会发生这种情况)。

所以我只看到这种设计的缺点。我错过了什么?有什么好处,首先是这样实施的原因是什么?

1 个答案:

答案 0 :(得分:5)

阅读<bits/basic_string.h>顶部的长注释,它解释了指针指向的内容以及字符串长度(和引用计数)的存储位置以及为什么这样做。

但是,C ++ 11不允许引用计数的写时复制std::string,因此GCC实现必须更改,但这样做会破坏ABI,因此会延迟到ABI改变是不可避免的。我们不想改变ABI,然后几个月后再次改变它。当它发生变化时,它应该只改变一次,以尽量减少用户的麻烦。