标记方法指针/引用参数常量真的会显著影响性能吗
Does marking method pointer/reference parameters const really affect performance noticeably?
抛开将参数标记为const的主要原因不谈——这样你就不会错误地更改被引用的对象——有时有人建议这样做会更快,因为编译器知道被引用对象不会被修改。
然而,在现代C++编译器中,这真的可能是真的吗?与调用方法的开销相比,节省的开销是否微不足道?
如果是这样的话,有人能在较低的层次上解释差异是什么吗,即编译器如何表现得不同——也许可以举一个具体的例子,说明这样做会产生不小的差异?
有时有人建议这样做会更快,因为编译器知道引用的对象不会被修改。
如果您有一个常量引用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
!
现代编译器足够聪明,即使您没有将变量指定为const
,也可以查看是否要修改它。例如,我刚刚检查了以下代码的汇编程序输出:
void foo( int & a )
{
std::cout << a;
}
int main()
{
int a = 0;
foo(a);
}
其中a
参数为int &
和const int &
,并且毫不奇怪,在这两种情况下asm输出完全相同。
然而,在使用(const)引用与传递值的情况下,会有相当大的差异。因此,为自己和同事使用const
,而不是为编译器使用。
相关文章:
- 数组中的不同浮点值会影响性能 10 倍 - 为什么?
- 为 lambda 分配名称会影响性能吗?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 隐式转换函数的返回对象时是否会影响性能?
- 何时应使用 C++ 固定宽度整数类型,它们如何影响性能?
- 性能 - 链接 C 尖锐和C++如何影响性能
- C 指针向量如何影响性能
- 公开类的内部组件,以防止编写过多代码和影响性能
- .NET 4,C ,IF..Else和Switch()如何影响性能
- 变量会影响性能吗
- 更改自动分配内存的范围是否会影响性能
- 如何修复不影响性能的"runtime error"?
- 返回间接类型化对象是否会影响性能
- 调用恒定复杂度O(1)5行函数会显著影响性能,原因如下
- 使用Pimpl的高级变体时可能会影响性能
- 功能原型设计会影响性能吗
- 在C/ c++中包含未使用的头文件会影响性能吗?
- 我可以在不影响性能的情况下将此宏更改为内联函数吗
- Dispatch_async在下面的代码中影响性能
- c++中的操作符重载如何影响性能