0

我想更好地理解如何改变函数签名:

void foo(double x);

至:

void foo(const double x);

如果我们不修改里面的 x ,可能会导致一些代表编译器的优化技巧。有人可以给我一个具体的,具体的例子吗?

4

3 回答 3

4

您所做的更改没有任何效果。 x在这两种情况下都是按值传递的,因此声明它const不会影响调用站点的任何内容。唯一的区别是,在您的实现内部foo您将不允许x在第二种情况下进行修改。不过,没有理由给自己这样的限制——如果你不修改x,即使没有const.

于 2013-08-01T17:02:52.553 回答
3

现代编译器通常无论如何都可以解决这个问题,假设foo函数中的代码对编译器是可用的——如果不是,那么编译器也无能为力。

对于不修改传递给函数的指针/引用/数组变量的承诺(或合同,如果您愿意的话)更为重要 - 对于调用函数的程序员来说更重要,因为他们知道被修改的值没有问题. 但是对于简单的值变量,它们无论如何都是副本,所以根本没有区别。

于 2013-08-01T17:02:47.777 回答
2

这实际上通常用作正确性帮助,而不是用于任何编译器优化。如果您有按值传递,则将其标记为const这样可以防止您在打算进行其他操作时意外修改参数。

即便如此,它仍然不是一种完全常见的形式。

从理论上讲,它可以使编译器一次从内存加载到寄存器中并避免重新读取该值,但是编译器通常可以在没有帮助的情况下自行解决这个问题,因为除非您不遗余力地为参数设置别名,否则编译器可以看到在哪里它正在函数的范围内更新。

于 2013-08-01T17:03:54.137 回答