一个很好的例子说明了如何使函数primitve param const导致编译器优化

Good example of how making function primitve param const will led to compiler optimization

本文关键字:param primitve 函数 何使 const 优化 编译器 说明了 一个 很好      更新时间:2023-10-16

我想更好地了解如何从say:更改函数签名

void foo(double x);

至:

void foo(const double x);

如果我们不修改内部的x,可能会为编译器带来一些优化技巧。有人能给我举一个具体的例子吗?

您所做的更改没有任何效果。在这两种情况下,x都是通过值传递的,因此声明它const不会影响调用站点上的任何内容。唯一的区别是foo的实现中,在第二种情况下不允许修改x。不过,没有理由给自己这样的限制——如果不修改x,即使在没有const的情况下,编译器也可能会进行适当的优化。

假设foo函数中的代码对编译器可用,那么现代编译器通常无论如何都能解决这个问题——如果没有,编译器几乎无法做到这两种方法。

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

这实际上通常被用作正确性辅助,而不是任何编译器优化。如果您有一个pass-by-value,那么像这样将其标记为const将防止您在想要其他参数时意外修改该参数。

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

理论上,它可以使编译器从内存加载到寄存器中一次,避免重新读取值,但编译器通常可以在没有帮助的情况下自行解决这一问题,因为除非你特意对参数进行别名,否则编译器可以看到它在函数范围内的更新位置。