【发布时间】:2018-05-17 18:10:23
【问题描述】:
我有一个多年前写的旧字符串类(在标准库如此标准之前)。它工作正常,但我想我应该在我的最新项目中进入 21 世纪。我想知道标准库字符串类的效率如何。例如,如果我将一个字符串传递给一个函数或简单地将它分配给另一个字符串,它会复制数据,还是简单地复制一个指向数据的指针。
在我的旧课程中,我对数据进行了引用计数,并只是复制了指针。如果我做了一些修改字符串的事情,我会检查它的引用是否为 1。如果它是 1,我可以使用相同的字符串数据区域,假设字符串没有增长到超过它的原始大小。如果它大于 1,我会在修改之前复制字符串数据。
标准库类是否做类似的事情(或希望更好),还是在每次传递字符串时复制数据。我想这可能取决于实现。我目前正在为 Windows 开发,但我可能稍后会移植它。谢谢
【问题讨论】:
-
std::string在大多数情况下可能会因为小字符串优化而超过您的性能。移动支持等。但你应该分析并找出答案。 -
@Jabberwock 不同之处在于我可以通过“值”将 COW 字符串传递给新线程,并认为我是线程安全的。使用
std::string,您是线程安全的,因为您确实得到了一份副本。这允许您执行诸如在 C++17 中拥有非constdata()成员之类的事情,因为如果您使用值语义,您可以确保缓冲区不应跨线程共享。 -
如果你让你的 COW 字符串类线程安全,那么当你在非线程的情况下使用它时,你付出了高性能的代价。
-
@Jabberwock 警告词,如果您在线程环境中使用 COW 字符串,请务必非常小心。您可能会导致未定义的行为。
-
好吧,对于
std::string,您希望尽可能移动而不是复制。使用 COW 字符串,您总是添加引用。
标签: c++ string performance