100
Case - 1:
在程序中声明常量时,
int const x = 2;
编译器可以通过不向该变量提供存储而将其添加到符号表中来优化该常量.因此,后续读取只需要间接进入符号表,而不是从内存中获取值的指令.
注意:如果您执行以下操作:
const int x = 1;
const int* y = &x;
然后这将迫使编译器为x
分配空间.因此,这种优化程度在这种情况下是不可能的.
就函数参数而言,const
表示函数中不修改参数.据我所知,使用const
并没有显著的性能提升,而是一种确保正确性的方法.
Case - 2:
"将参数和/或返回值声明为const是否有助于编译器生成更优化的代码?"
const Y& f( const X& x )
{
// ... do something with x and find a Y object ...
return someY;
}
编译器能做得更好的是什么?它能避免参数或返回值的副本吗?
否,因为参数已经通过引用传递.
它能将x或某物的副本放入只读存储器吗?
不,因为x
和someY
都生活在它的范围之外,都来自和/或给予了外部世界.即使someY
本身在飞翔上是动态分配的,它和它的所有权也会让给调用者.
对出现在f()主体内的代码进行可能的优化怎么办?由于const,编译器能以某种方式改进它为f()主体生成的代码吗?
即使在调用常量成员函数时,编译器也不能假定对象x
或对象someY
的位不会改变.此外,还有其他问题(除非编译器执行全局优化):编译器可能也不确定其他代码是否具有将同一对象别名为x
和/或someY
的非常量引用,而且,在f();
的执行过程中,对同一对象的任何此类非常量引用是否会被意外使用,编译器甚至可能不知道x
和someY
仅仅是引用的真实对象是否首先被声明为常量.
Case - 3:
void f( const Z z )
{
// ...
}
这里面会有什么优化吗?
是的,因为编译器知道z
确实是一个常量对象,所以即使没有全局分析,它也可以执行一些有用的优化.例如,如果f()
的主体包含像g( &z )
这样的调用,那么编译器可以确保z
的不可变部分在对g()
的调用期间不会改变.