将参数标记为const的主要原因放在一边 - 这样你就不会错误地改变引用的对象 - 有时会建议这样做会更快,因为编译器知道引用的对象不会被修改
然而,这在现代C ++编译器中是否真的可能是正确的 - 与调用方法的开销相比,它是否显着无效?
如果是这样,有人可以在较低级别解释差异是什么,即编译器的行为方式如何 - 并且可能给出一个具体的例子,这样做会产生非平凡的差异?
答案 0 :(得分:2)
有时候建议这会更快,因为编译器知道不会修改引用的对象。
如果你有一个const引用r
,那么编译器只知道引用的对象不能通过r
来改变。但由于const引用也绑定到可变对象,因此const引用在优化方面不是特别有用。考虑这个经典的反例:
void foo(const int& a, int& b)
{
std::cout << a*a << '\n';
++b;
std::cout << a*a << '\n';
}
这会打印两次相同的数字,还是两个不同的数字?如果a
和b
表示同一个对象,则会得到两个不同的数字,即使我们从不在函数内直接修改a
!
答案 1 :(得分:1)
即使您没有将变量指定为const
,现代编译器也足够聪明,可以查看变量是否会被修改。例如,我刚检查了此代码的汇编输出:
void foo( int & a )
{
std::cout << a;
}
int main()
{
int a = 0;
foo(a);
}
a
参数为int &
和const int &
,毫无疑问,asm输出在两种情况下完全相同。
但是,如果使用(const)引用vs传递值,则会有相当大的差异。因此,为自己和同事使用const
,而不是编译器。