【问题标题】:Optimization in std::string based on same const literals基于相同 const 字面量的 std::string 优化
【发布时间】:2013-05-06 17:07:32
【问题描述】:

我们知道编译器可以重用相同的常量字符串文字来有效地节省内存。这种优化对于编译器是可选的。

Two string literals have the same pointer value?

const char *s1 = "HELLO";
const char *s2 = "HELLO";

s1s2 可以有相同的地址。它们在许多编译器中具有相同的地址。例如,两者都指向地址0x409044

嗯。

我心中的问题是,为什么std::string 不尝试拥有同样的优势?它不会尝试将std::string 包裹在该地址周围。

const std::string ss1("HELLO");
const std::string ss2("HELLO");

cout << (void*) ss1.c_str() << endl;
cout << (void*) ss2.c_str() << endl;

ss1ss2 有两个不同的地址。

这在技术上是不可能的吗?语言禁止?还是标准库实现的开发者不想要它?

【问题讨论】:

  • 认为这是 C++11 标准所禁止的,因为 std::string 的这种写时复制实现会在多线程环境中导致问题
  • @AndyProwl:看起来合乎逻辑,如果可能的话,请您显示该段落吗?
  • @Andy 你能给出标准中的段落编号吗?
  • 前段时间我有一个类似的问题 - 并得到了很多有趣的讨论stackoverflow.com/questions/2312860/…

标签: c++


【解决方案1】:

总的来说,C++ 标准库类都实现了强值语义,这意味着每个对象都拥有它的所有数据,因此对象的生命周期很容易推理。虽然引用跟踪实现可能是可能的,但它会带来相当大的复杂性成本,并且不符合 C++ 的“不为你没有要求的东西付费”的理念.

长期以来,人们一直在讨论非拥有的类字符串类(如果您想搜索的话,可以使用 string_refarray_ref 之类的),这只是对现有的 views字符串。这会给用户带来负担,以确保底层共享数据的生命周期适合应用程序。将来它可能会成为标准的一部分,但如果您有兴趣,请搜索现有的实现。

【讨论】:

    【解决方案2】:

    这种行为的一个原因可能是对象的内存管理:

    std::string 对象负责它们的字符数组。这意味着数组在 std::string 析构函数中被删除 - 这样的数组应该只被删除一次。

    在 C char 数组中声明为

    const char* bla = "blabla";
    

    已经 - 或者永远不应该 - 被释放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-26
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多