gpt4 book ai didi

c++ - GNU STL 字符串 : is copy-on-write involved here?

转载 作者:IT老高 更新时间:2023-10-28 22:34:10 27 4
gpt4 key购买 nike

(免责声明:我不知道 C++ 标准对此会说什么……我知道,我很糟糕)

在处理非常大的字符串时,我注意到 std::string 正在使用写时复制。我设法编写了最小的循环来重现观察到的行为,例如,下面的循环运行得非常快:

#include <string>
using std::string;
int main(void) {
string basestr(1024 * 1024 * 10, 'A');
for (int i = 0; i < 100; i++) {
string a_copy = basestr;
}
}

在循环体 a_copy[1] = 'B'; 中添加写入时,显然发生了实际复制,并且程序在 0.3 秒内运行,而不是几毫秒。 100 次写入使其速度减慢了大约 100 倍。

但后来变得很奇怪。我的一些字符串没有写入,只是读取,这没有反射(reflect)在执行时间上,这几乎与字符串上的操作数量成正比。经过一番挖掘,我发现简单地从字符串中读取仍然会给我带来性能损失,因此我假设 GNU STL 字符串正在使用读取时复制 (?)。

#include <string>
using std::string;
int main(void) {
string basestr(1024 * 1024 * 10, 'A');
for (int i = 0; i < 100; i++) {
string a_copy = basestr;
a_copy[99]; // this also ran in 0.3s!
}
}

在 Revel 于我的发现一段时间后,我发现从基本字符串中读取(使用 operator[])对于整个玩具程序也需要 0.3 秒。我对此不是 100% 满意。 STL 字符串确实是读取时复制,还是它们根本允许写入时复制?我被引导认为 operator[] 有一些保护措施,可以防止保留它返回的引用并稍后写入它的人;真的是这样吗?如果不是,那么到底发生了什么?如果有人可以指出 C++ 标准中的某些相关部分,那也将不胜感激。

作为引用,我使用的是 g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3 和 GNU STL。

最佳答案

C++ 不区分 operator[] 用于读取和写入,而仅区分 operator[] 用于 const 对象和可变(非 const)对象。由于 a_copy 是可变的,可变的 operator[] 将被选择,这将强制复制,因为该运算符返回(可变)引用。

如果关注效率,您可以将 a_copy 强制转换为 const string 以强制 const 版本的 operator[ ] 被使用,它不会复制内部缓冲区。

char f = static_cast<const string>(a_copy)[99];

关于c++ - GNU STL 字符串 : is copy-on-write involved here?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4067395/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com