【发布时间】:2011-06-10 12:18:47
【问题描述】:
我们有一个 C++ (MFC) 中的多线程桌面应用程序。目前开发人员使用 CString 或 std::string,可能取决于他们的心情。所以我们想选择一个实现(可能不是这两个)。
MFC 的 CString 基于写时复制 (COW) 习惯用法,有些人会声称这在多线程环境中是不可接受的(并且可能引用 this article)。我不相信这样的说法,因为原子计数器似乎相当快,而且这种开销通过减少内存重新分配以某种方式得到补偿。
我了解到 std::string 的实现依赖于编译器——它不是 MSVC 中的 COW,但它是,或者曾经在 gcc 中。据我了解,新的 C++0x 标准将通过要求非 COW 实现来解决此问题,并解决一些其他问题,例如连续缓冲区要求。所以实际上 std::string 在这一点上看起来没有很好的定义......
我不喜欢 std::string 的一个简单示例:如果没有过多的重新分配,就无法从函数返回字符串(如果按值返回,则复制构造函数,并且无法访问内部缓冲区来优化它所以“通过引用返回”例如std::string& Result 没有帮助)。我可以通过按值返回(由于 COW 没有复制)或通过引用传递并直接访问缓冲区来使用 CString 执行此操作。同样,C++0x 以其右值引用来拯救,但我们不会在最近的特征中使用 C++0x。
我们应该使用哪个字符串类? COW真的会成为问题吗?还有其他常用的有效字符串实现吗?谢谢。
编辑:我们目前不使用 unicode,我们不太可能需要它。但是,如果有一些东西可以轻松支持 unicode(而不是以 ICU 为代价...),那将是一个加分项。
【问题讨论】:
-
你知道RVO吗?这可能会减轻您对字符串作为返回值的一些担忧。您可能还想阅读Want Speed? Pass By Value.
-
如果您想要未来的证明,请选择 std::string。此外,它快速、防弹且支持极好。
-
C++0x 不允许
std::basic_string的 COW 实现。它不允许非连续缓冲区实现,例如 SGI 的“绳索”。 -
@Billy:你确定吗?我见过有人声称它确实不允许 COW,比如这里:stackoverflow.com/questions/4496150/…
-
@7vies:在 C++03 中,标准委员会确保竭尽全力确保 COW 是
std::string的有效实现。但是,这不是必需的。
标签: c++ multithreading string copy-on-write