考虑以下功能:
void func(const char & input){
//do something
}
显然,参数不是常量值是有意义的 引用关于char类型大小的常量,现在可以编译器将其优化为常量 价值,以便它会跟随?
void func(const char input){
//do something
}
答案 0 :(得分:5)
没有。这不等同。在第一种情况下,输入仍然可以改变,例如,如果它是对另一个线程修改的变量的引用。
答案 1 :(得分:2)
就像有人说的那样,但是很遗憾地被投票(不确定他为什么删除了他的答案),只要可观察的行为与没有做任何不同的行为相同,编译器就可以做任何事情。
如果你的函数写入引用,并且全局变量作为参数传递给函数,并且函数返回后全局稍后打印,或者其他任何花哨的东西都被打印出来,那么它是自扩展的,那么如果编译器会更改参数传递约定,编译器更难以证明您仍然获得相同的可观察行为。如果编译器无法证明它,则无法进行所需的优化。
所以无论出现什么进一步的问题,只要想想“只要我不注意它就可以做任何事情。”
答案 2 :(得分:1)
如上所述,不是一般的。但编译器可以做的是内联整个函数调用。如果提供的参数是编译时常量,它可以进行许多有趣的优化。