Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数primitve param const如何导致编译器优化的好例子_C++_Constants_Compiler Optimization - Fatal编程技术网

C++ 函数primitve param const如何导致编译器优化的好例子

C++ 函数primitve param const如何导致编译器优化的好例子,c++,constants,compiler-optimization,C++,Constants,Compiler Optimization,我想更好地了解如何更改函数签名,例如: void foo(double x); 致: 如果我们不修改x的内部,可能会导致一些代表编译器的优化技巧。有人能给我一个具体的例子吗?现代编译器通常都能解决这个问题,假设foo函数中的代码可供编译器使用——如果没有,编译器几乎不能以任何方式完成 如果您不希望修改传递给函数的指针/引用/数组变量,那么它对于承诺或契约更为重要,对于调用函数的程序员来说更为重要,因为他们知道修改的值没有问题。但对于简单的值变量,它们无论如何都是副本,所以根本没有区别 您所做的

我想更好地了解如何更改函数签名,例如:

void foo(double x);
致:


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

现代编译器通常都能解决这个问题,假设foo函数中的代码可供编译器使用——如果没有,编译器几乎不能以任何方式完成


如果您不希望修改传递给函数的指针/引用/数组变量,那么它对于承诺或契约更为重要,对于调用函数的程序员来说更为重要,因为他们知道修改的值没有问题。但对于简单的值变量,它们无论如何都是副本,所以根本没有区别

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

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

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


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

相关:使函数参数和局部变量为常量通常不会导致额外的优化,除非是在调试模式下。
void foo(const double x);