我知道,出于可读性原因,您应该在通过引用或指针传递参数时尽可能使用 const 关键字。如果我指定参数是常量,编译器是否可以进行任何优化?
可能有几种情况:
功能参数:
常量参考:
void foo(const SomeClass& obj)
常量 SomeClass 对象:
void foo(const SomeClass* pObj)
以及指向 SomeClass 的常量指针:
void foo(SomeClass* const pObj)
变量声明:
const int i = 1234
函数声明:
const char* foo()
每个都提供什么样的编译器优化(如果有)?
原文由 UnTraDe 发布,翻译遵循 CC BY-SA 4.0 许可协议
资源
情况1:
当您在程序中声明
const
时,编译器可以通过不为这个变量提供存储来优化这个
const
;相反,它可以添加到符号表中。因此,后续读取只需要间接进入符号表,而不是从内存中获取值的指令。注意:如果您执行以下操作:
那么这将强制编译器为
x
分配空间。因此,对于这种情况,这种优化程度是不可能的。函数参数方面
const
表示函数中没有修改参数。据我所知,使用const
并没有显着的性能提升;相反,它是确保正确性的一种手段。案例二:
不,因为参数已经通过引用传递。
不,因为
x
和someY
都在其范围之外并且来自和/或被给予外部世界。即使someY
在f()
本身内动态分配,它和它的所有权都交给调用者。即使调用 const 成员函数,编译器也不能假定对象
x
或对象someY
的位不会改变。此外,还有其他问题(除非编译器执行全局优化):编译器也可能不确定没有其他代码可能具有非常量引用,该引用将同一对象别名为x
和/或someY
,以及在f();
执行期间是否可能偶然使用对同一对象的任何此类非常量引用,并且编译器甚至可能不知道真实对象是否x
和someY
只是引用,实际上首先声明为 const 。案例3:
是的,因为编译器知道
z
确实是一个 const 对象,即使没有全局分析,它也可以执行一些有用的优化。例如,如果f()
的主体包含类似g( &z )
的调用,编译器可以确定 ---z
--- 的非可变部分在致电g()
。