标记方法指针/引用参数const是否真的会显着影响性能?

时间:2014-04-24 13:08:16

标签: c++ visual-c++ compiler-construction

将参数标记为const的主要原因放在一边 - 这样你就不会错误地改变引用的对象 - 有时会建议这样做会更快,因为编译器知道引用的对象不会被修改

然而,这在现代C ++编译器中是否真的可能是正确的 - 与调用方法的开销相比,它是否显着无效?

如果是这样,有人可以在较低级别解释差异是什么,即编译器的行为方式如何 - 并且可能给出一个具体的例子,这样做会产生非平凡的差异?

2 个答案:

答案 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';
}

这会打印两次相同的数字,还是两个不同的数字?如果ab表示同一个对象,则会得到两个不同的数字,即使我们从不在函数内直接修改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,而不是编译器。