标记方法指针/引用参数常量真的会显著影响性能吗

Does marking method pointer/reference parameters const really affect performance noticeably?

本文关键字:影响 性能 真的 常量 方法 指针 参数 引用      更新时间:2023-10-16

抛开将参数标记为const的主要原因不谈——这样你就不会错误地更改被引用的对象——有时有人建议这样做会更快,因为编译器知道被引用对象不会被修改。

然而,在现代C++编译器中,这真的可能是真的吗?与调用方法的开销相比,节省的开销是否微不足道?

如果是这样的话,有人能在较低的层次上解释差异是什么吗,即编译器如何表现得不同——也许可以举一个具体的例子,说明这样做会产生不小的差异?

有时有人建议这样做会更快,因为编译器知道引用的对象不会被修改。

如果您有一个常量引用r,那么编译器只知道被引用的对象不能通过r更改。但由于const引用也绑定到可变对象,因此const引用对优化没有特别的帮助。考虑一下这个经典的反例:

void foo(const int& a, int& b)
{
    std::cout << a*a << 'n';
    ++b;
    std::cout << a*a << 'n';
}

这会把同一个数字打印两次,还是两个不同的数字?如果ab表示同一个对象,则会得到两个不同的数字,尽管我们从未在函数内部直接修改a

现代编译器足够聪明,即使您没有将变量指定为const,也可以查看是否要修改它。例如,我刚刚检查了以下代码的汇编程序输出:

void foo( int & a )
{
    std::cout << a;
}
int main()
{
    int a = 0;
    foo(a);
}

其中a参数为int &const int &,并且毫不奇怪,在这两种情况下asm输出完全相同。

然而,在使用(const)引用与传递值的情况下,会有相当大的差异。因此,为自己和同事使用const,而不是为编译器使用。