【问题标题】:How to replace std::string with vstring?如何用 vstring 替换 std::string?
【发布时间】:2014-04-23 21:50:50
【问题描述】:

我最近了解到,几年前 libstdc++ 库包含 vstring(也称为 versa_string),它提供与 std::string 相同的功能,但显然更符合 C++ 标准。我曾尝试使用vstring 代替std::string,但没有找到简单的方法。

有没有一种简单的方法可以将 std::string 替换为 vstring,而无需更改 libstdc++ 源?

我可以用别名替换代码中所有std::string 的使用,如下面的清单所示。但是,这种方法的问题是,std::string 也在某些地方内部使用,例如在std::ostringstream。这意味着,std::ostringstream os; my::string s = os.str(); 语句不再有效。

namespace my {
#ifdef __GLIBCXX__
    using string = __gnu_cxx::__vstring;
#else
    using string = std::string;
#endif
}

【问题讨论】:

  • 最新版本? vstring 在 4.1 中添加。见stackoverflow.com/questions/10463851/what-is-gccs-vstring
  • 我似乎记得 Herb Sutter 在一些视频中说 gcc4.9 将使 std::string 不被计算在内,但我在发行说明中没有看到这一点。您可以改用my::string s = os.str().c_str(); 来修复您列出的一种情况下的错误。甚至可能有一种方法可以访问底层流缓冲区以避免中间 std::string,但我不确定那部分。
  • @Praetorian:JW 说它不会制作 4.9 stackoverflow.com/questions/21431633/…
  • 确实,COW 字符串死亡的传言被大大夸大了 ;-) 要回答这个问题,不,没有办法在库中替换std::string。您必须等待 GCC 4.10
  • @JonathanWakely:我想你可以这样回答。

标签: c++ string c++11 libstdc++


【解决方案1】:

不,没有办法将std::string 替换为vstring,这是一种替代字符串类型,而不是std::string 的直接替换

从 GCC 5.1 开始,该库附带了两个 std::string 实现,对于任何给定的翻译单元,您可以通过 _GLIBCXX_USE_CXX11_ABI 宏选择使用哪个。这两种字符串类型具有不同的重命名名称,因此不兼容链接。

更多详情请见Dual ABI

【讨论】:

  • 鉴于 GCC 自 2014 年以来的进展情况,您介意更新此答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
相关资源
最近更新 更多