我想更好地理解如何改变函数签名:
void foo(double x);
至:
void foo(const double x);
如果我们不修改里面的 x ,可能会导致一些代表编译器的优化技巧。有人可以给我一个具体的,具体的例子吗?
我想更好地理解如何改变函数签名:
void foo(double x);
至:
void foo(const double x);
如果我们不修改里面的 x ,可能会导致一些代表编译器的优化技巧。有人可以给我一个具体的,具体的例子吗?
您所做的更改没有任何效果。 x
在这两种情况下都是按值传递的,因此声明它const
不会影响调用站点的任何内容。唯一的区别是,在您的实现内部,foo
您将不允许x
在第二种情况下进行修改。不过,没有理由给自己这样的限制——如果你不修改x
,即使没有const
.
现代编译器通常无论如何都可以解决这个问题,假设foo
函数中的代码对编译器是可用的——如果不是,那么编译器也无能为力。
对于不修改传递给函数的指针/引用/数组变量的承诺(或合同,如果您愿意的话)更为重要 - 对于调用函数的程序员来说更重要,因为他们知道被修改的值没有问题. 但是对于简单的值变量,它们无论如何都是副本,所以根本没有区别。
这实际上通常用作正确性帮助,而不是用于任何编译器优化。如果您有按值传递,则将其标记为const
这样可以防止您在打算进行其他操作时意外修改参数。
即便如此,它仍然不是一种完全常见的形式。
从理论上讲,它可以使编译器一次从内存加载到寄存器中并避免重新读取该值,但是编译器通常可以在没有帮助的情况下自行解决这个问题,因为除非您不遗余力地为参数设置别名,否则编译器可以看到在哪里它正在函数的范围内更新。