[英]Why is COW std::string optimization still enabled in GCC 5.1?
[英]Turning off COW in GCC
我已经知道GCC对std::string
使用COW(Copy-On-Write),这使得在多线程程序中无法使用std::string
。 但据我所知,C ++ 11禁止使用COW实现,因为线程现在由标准定义,并且移动语义几乎已经过时了对COW的需求。
现在,GCC 4.6实现了大量的C ++ 11标准。 但似乎实现仍在使用COW语义。 在我写的多线程应用程序中,随机发生的神秘seg-fault引起了我的注意。 事实上,我通过以下测试代码证实了这是一个COW问题:
#include <iostream>
#include <string>
#include <cassert>
#include <thread>
using namespace std;
int main()
{
std::string orig = "abc";
std::string copy = orig;
std::cout << (void*) orig.data() << ", " << (void*) copy.data() << endl;
assert(orig.data() == copy.data());
}
编辑:注意这里包含<thread>
标头,证明这是一个C ++ 11程序。 这里有一个连接到ideone确认我在说什么,(至少对于GCC 4.5.1,ideone使用)
我不记得为什么,但出于某种原因,我认为std=c++0x
标志会消除COW语义,但事实并非如此。 即使使用--std = c ++ 0x标志 ,上述代码中的断言也是成功的。 基本上,从GCC 4.6开始, std::string
在多线程应用程序中仍然无法使用。
有没有办法禁用COW语义? 或者我现在需要使用std::vector<char>
,直到GCC修复此问题?
如果要在线程边界上传递字符串,请执行显式复制,以强制它为独立字符串,然后将其传递给:
std::string a="bob";
std::string b(a.data(), a.length());
在所有交叉线程的地方都必须这样做很烦人,但在我看来它比vector<char>
更容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.