其他分享
首页 > 其他分享> > c – 编译器是否可以自动生成std :: move以便最后使用左值?

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