钱德勒卡鲁斯在他的谈话对编译器的优化表示,编译器在与按引用传递参数优化功能可怕.我可以理解,当参数是非const引用时很难,因为编译器必须处理内存,或者参数的类型很复杂(一些奇怪的结构或类).但是如果参数是const引用而内置类型真的有问题吗?优化器可以代替const float&
用const float
?启用SSE指令后,它可能会更有帮助,因为编译器可以正确地为它们对齐数据.
优化器可以代替
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; }
这打印
3.25 13.75
演示1
如果您更改const float&
与const float
,其结果将是
3.25 3.25
演示2
这里的问题是a[0]
相同的x
,但是连接是由调用者建立的,它在优化器的控制范围之外.