小编Vad*_*nov的帖子

为什么修改另一个变量引用的字段会导致意外行为?

我写的这段代码乍一看很简单。它修改被引用变量引用的变量,然后返回引用的值。重现奇怪行为的简化版本如下所示:

#include <iostream>
using std::cout;

struct A {
    int a;
    int& b;

    A(int x) : a(x), b(a) {}
    A(const A& other) : a(other.a), b(a) {}
    A() : a(0), b(a) {}
};

int foo(A a) {
    a.a *= a.b;
    return a.b;
}


int main() {
    A a(3);

    cout << foo(a) << '\n';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,当它在启用优化(g++ 7.5)的情况下编译时,它会产生与未优化代码不同的输出(即 9 个没有优化 -正如预期的那样,3 个启用了优化)。

我知道volatile关键字,它可以防止编译器在存在某些副作用(例如异步执行和特定于硬件的东西)的情况下重新排序和其他优化,并且在这种情况下也有帮助。

但是,我不明白为什么在这种特殊情况下需要将引用 b 声明为 volatile ?这段代码的错误来源在哪里?

c++ gcc g++ volatile compiler-optimization

26
推荐指数
1
解决办法
500
查看次数

标签 统计

c++ ×1

compiler-optimization ×1

g++ ×1

gcc ×1

volatile ×1