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

Ale*_*x Z 4 string implementation gcc stl stdstring

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

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

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

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

Jon*_*ely 5

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

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

  • @KerrekSB C++ 11 ABI更改发生在GCC 5.1:https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html(并且您可以定义一个宏来保留旧的ABI,即使是今天的GCC 8.x). (2认同)