c – 编译器是否可以自动生成std :: move以便最后使用左值?
作者:互联网
像这样的代码经常出现在r值引用文章中:
Dave Abrams: Move It With Rvalue References
void g(X);
void f()
{
X b;
g(b); // still need the value of b
…
g( std::move(b) ); // all done with b now; grant permission to move
}
编译器是否可以自动生成此优化,即检测l值是否会被破坏并且可能会被移除,或者这会违反标准,假设一般情况编译器不知道如何是移动,复制或破坏为X类实现?
如果允许这样的优化,它是否由某些编译器在实践中执行?
解决方法:
不,请考虑:
using X = std::shared_ptr<int>;
void g(X);
void f() {
X b = std::make_shared<int>();
int &i = *b;
g(b); // last use of 'b'
i = 5;
}
通常,编译器不能假设更改X的副本,移动和析构函数的语义将是合法的更改,而不对围绕b的使用的所有代码执行分析(即,整个f,g和所有类型其中使用的).
实际上,在某些情况下,可能需要进行全程序分析:
using X = std::shared_ptr<std::lock_guard<std::mutex>>;
std::mutex i_mutex;
int i;
void g(X);
void f() {
X b = std::make_shared<std::lock_guard<std::mutex>>(i_mutex);
g(b); // last use of 'b'
i = 5;
}
如果移动了b,则会引入针对其他线程的数据争用,这些线程使用i_mutex同步对i的访问.
标签:c,c11,rvalue-reference 来源: https://codeday.me/bug/20190925/1816762.html