【问题标题】:What is GCC's "vstring"?什么是 GCC 的“vstring”?
【发布时间】:2012-05-05 16:39:27
【问题描述】:

我阅读了一些 GCC 错误报告,那里的人在谈论“vstring”。搜索 WEB 我注意到 http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/vstring_8h.html

有人可以详细说明它的用途和用途吗?为什么要使用它而不是 std::string?

【问题讨论】:

  • 您提供的链接在顶部提到了“此文件是标准 C++ 库的 GNU 扩展。” 当然,这并不能完全回答您的问题。跨度>
  • 如果没记错的话,那是/曾经是std::string 的实验性重新实现,具有相同的界面但不同的胆量。该文件的版权日期为 2005-2007 年,此后没有任何内容;建议在该时间段内搜索 libstdc++ mailing list archive 以获取提及。

标签: c++ gcc


【解决方案1】:

GCC 的 vstring 是一个通用的字符串类,它是在 GCC 4.1 的 libstdc++ 实现中引入的。

它与std::basic_string 兼容,具有以下附加详细信息:

  • 提供了两个基类:
    • 默认避免引用计数,并针对短字符串进行了优化;
    • 替代的,仍然使用它(即引用​​计数),同时在一些低级领域(例如对齐)进行了改进。有关一些有用的 typedef,请参阅 vstring_fwd.h
  • 已经重写了各种算法(例如替换),简化了代码并添加了简单的优化。
  • DR 431 的选项 3 针对两个可用的基础实施,从而改进了对有状态分配器的支持。

DR431 是 Library Working Group Defect Report 431,选项 3 看起来像是为类实现更好的分配器支持,以允许更好的交换和其他与分配器相关的操作。

基本细节来自GCC 4.1's release notes,位于运行时库部分。

编辑:

看起来这个扩展的最初目的是为 C++11 std::string 实现提供基础。 GCC/libstdc++ 贡献者 Paolo Carlini 在此 GCC Bug Report 中发现 <ext/vstring.h> 包含下一个 std::string 的非引用计数实验版本。 2012 年 4 月 12 日的评论:

我们试图解释的是,这类问题是众所周知的,而且或多或少 更少,影响任何引用计数的实现...... 当不使用引用计数时,情况并非如此,而且确实不会std::string 的新实现中使用(根据新的 C++11 标准) 我们目前正在展示为<ext/vstring.h>...

【讨论】:

  • 发明它的理由是什么?最终会成为std::string的实现吗?
  • @JohannesSchaub-litb - 我相信这是ext/vstring.h 的最初目的,它将提供一个非引用计数的字符串实现,最终将成为默认(或成为基础) GCC 的 C++11 实现的新 std::string 实现。 GCC 邮件列表和错误报告中有各种 cmets 似乎指向了这一点,例如此评论:gcc.gnu.org/bugzilla/show_bug.cgi?id=52938#c5 和此:old.nabble.com/…。这就是我不问就知道的。
  • gcc.gnu.org/ml/libstdc++/2012-01/msg00064.html 暗示它尚未成为 std::string 实现的唯一原因是 ABI 兼容性限制。
  • 随着 GCC 5 中的 ABI 转换,我引入了一个新的 std::basic_string 实现,从 vstring 的 SSO 版本中复制大部分代码。
  • 对于那些不认识首字母缩写词的人(直到几秒钟前还像我一样)- SSO 是上面提到的“短字符串优化”。另请参阅 Stackoverflow 上的 Meaning of acronym SSO in the context of std::string
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2012-11-23
  • 2013-07-15
  • 2012-12-30
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多