是否在GCC 4.x/C++ 11中重新计算了std :: string?

Dre*_*ann 34 c++ gcc stdstring c++11

std::string使用gcc 4时引用计数-std=c++0x-std=c++11

Jes*_*ood 25

查看我找到的libstdc ++文档(有关详细信息,请参阅链接):

字符串如下所示:

                       [_Rep]
                       _M_length
[basic_string<char>]   _M_capacity
_M_dataplus            _M_refcount
_M_p ----------------> unnamed array of char_type
Run Code Online (Sandbox Code Playgroud)

所以,是的,它被重新计算.另外,从这里的讨论:

是的,std :: string在某些时候会被作为非引用计数,但由于非引用计数的字符串在C++ 98中也是有效的,一个选项是切换到非引用计数的字符串对于-std = c ++ 98和-std = c ++ 11模式.我不是说会发生什么,但可能会发生.

因此,似乎有计划将其改为符合(我不知道进展如何).

更新 正如emsr在评论中指出的那样,目前有一个非引用计数扩展名称vstring.h,并且似乎它没有被替换的唯一原因std::string是因为ABI兼容性.这里有一个关于它的问题.

  • 这是 libstdc++ 维护者中已知的缺陷。修复它会破坏 ABI 并造成很多麻烦。作为扩展,我们有反之亦然的字符串 [link](http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01602.html),它遵守 &lt;string&gt; 的 C++11 要求,因为它不不重新计票。在某些时候,我们会决定通过此更改和其他几个 C++11 更改来破坏 ABI。 (2认同)

Nic*_*las 22

C++ 11添加了特定的语言,禁止 std::string被引用计数.如果是的话,那么GCC的C++ 11标准库就会失败.

  • 您应该添加引文以使其具有权威性. (11认同)
  • 这可以作为参考,或至少作为理由:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2534.html (6认同)

Dre*_*ann 12

添加一些有用的信息,以便发布此问题.

std::string不再用GCC 5的版本引用计数,以满足此C++ 11的要求.

来自https://gcc.gnu.org/gcc-5/changes.html

默认情况下,使用小字符串优化而不是写入时复制引用计数来启用std :: string的新实现.

  • 一个复杂的问题是,虽然gcc开发人员将新的std :: string实现作为g ++ 5.1中的默认实现,但Fedora 22(包含g ++ 5.1的首批Linux发行版之一)选择将默认设置恢复为引用计数字符串.使用-D_GLIBCXX_USE_CXX11_ABI = 1在Fedora 22 build上获取非引用计数字符串.有关详细信息,请参阅[此处](http://developerblog.redhat.com/2015/02/10/gcc-5-in-fedora/).此外,对于类似于原始帖子的其他查询,我整理了一个有用的汇总表[here](http://info.prelert.com/blog/cpp-stdstring-implementations#summarytable). (2认同)