4

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

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

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

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

4

1 回答 1

5

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

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

于 2012-05-29T00:38:08.600 回答