【问题标题】:std::string / reference counting / conststd::string / 引用计数 / const
【发布时间】:2014-08-08 12:41:33
【问题描述】:

据我所知,std::string 可以被引用计数,也可以不被引用。我会说引用计数字符串有更好的性能? 所以我的问题是,将 std::string 设为 const 是否是一种好的编码风格?例如,局部变量或函数参数。我喜欢它,因为如果您知道变量是否要被更改,则更容易阅读代码。

据我了解,如果复制变量,则复制​​ const 字符串的值。还是我错了?我会说引用计数器不能更改,因为它是 const?

【问题讨论】:

  • "我会说引用计数字符串有更好的性能?" - 这完全取决于你对他们做什么。请注意,由于 C++11,它们不能合法地被引用计数,尽管一些实现仍然是。
  • "我会说引用计数器可以更改,因为它是常量?" - 假设你的意思是“不能”,那宁愿打败引用计数点。据推测,即使在 const 字符串中它也是可变的(这是合理的,因为它不是可见状态的一部分);但是您必须咨询特定的实现才能了解实际发生的情况。
  • 常量正确性总是一件好事,直到它不是。
  • 将字符串作为 const 引用传递给函数将保存一个副本。按 const 值不会。
  • as far as I know std::string can be reference counted or not std::string 在 C++11 中不能被引用计数。例如,必须有一个iterator begin() noexcept; 成员,这意味着它不能重新分配存储(并且既不会抛出异常也不会返回无效的迭代器),这意味着它不能在写入时被引用/复制。此外,根据 §21.4.1.6 N3337,在调用 begin 时它不能使自己的存储无效。另见open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2534.html

标签: c++ string


【解决方案1】:

据我所知,最新的 std::string 实现正在使用小字符串优化 (SSO) 而不是引用计数(因为在多核系统上需要锁定一些性能警告)。 SSO 包括为小字符串(例如,8 个字符左右)提供一个自动固定大小的数组;所以,如果你的字符串很小,就不需要在堆上分配、释放内存。

SSO 的问题在于,如果字符串很小,将字符串移动(使用移动语义)到另一个字符串的性能并不比复制它好(因为必须复制整个固定大小的数组)。

因此,尽可能使用 const 引用或 rvalue 引用,并避免使用 pass-by-value。

【讨论】:

  • 但是“整个固定大小的数组”很小,所以复制它很便宜,所以问题不大
  • @NeilKirk 抱歉,因为我的英语不太准确。我并不是说它是强制性的,只是它被用于多个实现。
  • @NeilKirk,不,这不是强制性的。禁止使用 COW,但允许实现者使用动态分配,即使是 1 字节的字符串(如果他们愿意)。
【解决方案2】:

据我了解,如果复制变量,则复制​​ const 字符串的值。还是我错了?我会说引用计数器不能更改,因为它是 const?

你错了。通常引用计数为mutable

您的实现是否具有引用计数 std::string 对您是否将变量设为 const 没有影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2021-12-29
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多