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

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

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

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

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

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

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

转载注明原文:GCC的std :: string – 为什么如此奇怪的实现 - 代码日志