优化器:用const对象替换const引用

Kos*_*nov 15 c++ optimization

钱德勒卡鲁斯在他的谈话对编译器的优化表示,编译器在与按引用传递参数优化功能可怕.我可以理解,当参数是非const引用时很难,因为编译器必须处理内存,或者参数的类型很复杂(一些奇怪的结构或类).但是如果参数是const引用而内置类型真的有问题吗?优化器可以代替const float&const float?启用S​​SE指令后,它可能会更有帮助,因为编译器可以正确地为它们对齐数据.

das*_*ght 13

优化器可以代替const float&const float

不,他们不能这样做,因为它可能会改变程序的语义.甲const参考仍然是一个参考.它不能被价值取代.考虑这个例子:

void foo(const float& x, float a[]) {
    cout << x << endl;
    a[0] += 10.5;
    cout << x << endl;
}

int main() {
    float a[1] = { 3.25 };
    foo(a[0], a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这打印

3.25
13.75
Run Code Online (Sandbox Code Playgroud)

演示1

如果您更改const float&const float,其结果将是

3.25
3.25
Run Code Online (Sandbox Code Playgroud)

演示2

这里的问题是a[0]相同的x,但是连接是由调用者建立的,它在优化器的控制范围之外.