我想更好地了解如何更改函数签名:
void foo(double x);
为:
void foo(const double x);
如果我们不修改x里面,可能会导致代表编译器的一些优化技巧。有人可以给我一个具体的具体例子吗?
答案 0 :(得分:5)
您所做的更改无效。 x
在两种情况下均按值传递,因此声明const
不会影响呼叫网站上的任何内容。唯一的区别是<{1>}内的在foo
的实现中,在第二种情况下,您将无法修改x
。没有理由给自己这样的限制 - 如果你不修改x
,编译器可能会在没有const
的情况下进行适当的优化。
答案 1 :(得分:3)
现代编译器通常可以解决这个问题,假设编译器可以使用foo
函数中的代码 - 如果不是这样,编译器可以做任何一种方式。
对于不修改传递给函数的指针/引用/数组变量的promise(或者合约,如果你愿意)更重要 - 对于程序员调用函数更多,知道没有问题价值被修改。但对于简单的价值变量,无论如何它们都是副本,所以根本没有区别。
答案 2 :(得分:2)
实际上,这通常用作正确性辅助,而不是用于任何编译器优化。如果你有一个pass-by-value,那么将它标记为const
就可以防止你在想要别的东西时意外修改参数。
即便如此,它仍然不是一种完全常见的形式。
理论上它可以使编译器从内存加载到寄存器一次并避免重新读取值,但编译器通常可以在没有帮助的情况下自行解决这个问题,因为除非您不遗余力地将参数别名为编译器可以看到它在函数范围内的更新位置。