在使用gcc 4配合 -std=c++0x
或 -std=c++11
时,std::string
是否采用引用计数?
C++11增加了特定的语言禁止对std::string
进行引用计数。 因此,如果存在这种情况,则GCC的C++11标准库存在相当大的缺陷。
查看libstdc++文档后我发现(更多信息请参见链接):
一个字符串长成这样:
[_Rep]
_M_length
[basic_string<char>] _M_capacity
_M_dataplus _M_refcount
_M_p ----------------> unnamed array of char_type
是的,它是引用计数的。此外,来自这里的讨论中提到:
是的,std::string最终会成为非引用计数的,但由于非引用计数的字符串在C++98中也是有效的,所以一个选择是在-std=c++98和-std=c++11模式下都切换到非引用计数的字符串。我不是说一定会发生这种情况,但这是可行的。
所以,似乎有计划将其改为符合要求(尽管我不知道进展如何)。
更新
正如emsr在评论中指出的那样,目前有一个名为vstring.h
的非引用计数扩展,似乎唯一的原因是因为ABI兼容性问题,它尚未替换std::string
。关于此问题有一个SO问题,在这里。
补充一些最新的信息。
std::string
将不再使用引用计数,以满足C++11的要求。这是在GCC 5发布时实现的。
参考https://gcc.gnu.org/gcc-5/changes.html
默认启用了新的std::string实现,使用小字符串优化而不是复制写引用计数。
FULLY_DYNAMIC_STRINGS
。库维护者不愿意切换的原因是这会破坏与早期编译代码的二进制兼容性。 - Kerrek SB