【问题标题】:Is std::string ref-counted in GCC 4.x / C++11?GCC 4.x / C++ 11 中的 std::string 引用计数了吗?
【发布时间】:2012-09-13 06:23:07
【问题描述】:

当使用 gcc 4 和 -std=c++0x-std=c++11 时,std::string 引用计数了吗?

【问题讨论】:

  • 这是一个有点笼统的问题。你可能有一个特定的版本,你肯定可以检查标题中的实现......
  • 我相信 C++11 引入了使写时复制成为不可能的要求,从而消除了对引用计数的需求,但我不记得我在哪里听说过。
  • @nosid 如果你能证明(标题或 gcc 邮件列表讨论等)你应该写一个答案而不是评论,这样你就可以得到支持;)
  • 我认为您可以设置一个宏来获取非引用字符串,例如FULLY_DYNAMIC_STRINGS 左右。库维护者不愿意切换的原因是它会破坏与之前编译的代码的二进制兼容性。
  • @DrewDormann:嗯,也许吧,但 GCC 从来没有进行过小字符串优化。不过,我必须检查一下。

标签: c++ gcc c++11 stdstring


【解决方案1】:

C++11 添加了特定语言禁止 std::string 不被引用计数。因此,如果是这样,那么它在 GCC 的 C++11 标准库中是一个非常重大的失败。

【讨论】:

  • 您应该添加引用以使其具有权威性。
  • @JosephGarvin:我可以引用一些使 C++11 无法使用引用计数的语言,但我没有 C++98/03 规范来引用原始语言使引用计数成为可能。我不知道具体发生了什么变化;我只知道是什么规则使它目前不可能。
  • 这可以作为参考,或者至少作为基本原理:open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2534.html
【解决方案2】:

查看libstdc++ documentation我发现(查看链接了解更多信息):

字符串如下所示:

                       [_Rep]
                       _M_length
[basic_string<char>]   _M_capacity
_M_dataplus            _M_refcount
_M_p ----------------> unnamed array of char_type

所以,是的,它是 ref 计数的。另外,来自here的讨论:

是的,std::string 将在某些时候成为非引用计数, 但作为非引用计数字符串在 C++98 中也是有效的,一个 选项是为两者切换到非引用计数的字符串 -std=c++98 和 -std=c++11 模式。我不是说这会发生,但它可能会发生。

所以,似乎有计划将其更改为符合要求(但我不知道进展如何)。

更新 正如 emsr 在 cmets 中指出的那样,目前有一个名为 vstring.h 的非引用计数扩展,它似乎没有取代 std::string 的唯一原因是因为 ABI 兼容性。有一个关于它的问题here

【讨论】:

  • 这是 libstdc++ 维护者已知的缺陷。修复它会涉及破坏 ABI 并造成很多麻烦。作为扩展,我们有一个versa 字符串link,它符合C++11 对 的要求,因为它不引用计数。在某个时候,我们决定用这个和其他几个 C++11 更改来打破 ABI。
  • 实际上,versa_string 是一个可以采用多种表示形式的包装器。一个是引用字符串,另一个是short string optimized 版本。
  • @emsr:感谢您提供的信息。我也发现了一个关于它的 SO 问题并将其添加到我的答案中。
  • @emsr:这是否意味着他们在 C++11 模式下恢复了所有 ABI 重大更改? GCC wiki 仍然说有破损:gcc.gnu.org/wiki/Cxx11AbiCompatibility
  • @JosephGarvin:我很确定 List::_M_size 已恢复,但我确信大部分剩余的 ABI 破损都在那里。我会按照检查 Wiki 的说明进行操作。
【解决方案3】:

在这个问题之后添加一些有用的信息。

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 构建中获取非引用计数字符串。有关详细信息,请参阅here。另外,对于与原帖类似的其他查询,我整理了一个有用的汇总表here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 2020-01-04
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多