一个很好的例子说明了如何使函数primitve param const导致编译器优化
Good example of how making function primitve param const will led to compiler optimization
我想更好地了解如何从say:更改函数签名
void foo(double x);
至:
void foo(const double x);
如果我们不修改内部的x,可能会为编译器带来一些优化技巧。有人能给我举一个具体的例子吗?
您所做的更改没有任何效果。在这两种情况下,x
都是通过值传递的,因此声明它const
不会影响调用站点上的任何内容。唯一的区别是在foo
的实现中,在第二种情况下不允许修改x
。不过,没有理由给自己这样的限制——如果不修改x
,即使在没有const
的情况下,编译器也可能会进行适当的优化。
假设foo
函数中的代码对编译器可用,那么现代编译器通常无论如何都能解决这个问题——如果没有,编译器几乎无法做到这两种方法。
这对于不修改传递给函数的指针/引用/数组变量的承诺(或者合同,如果你愿意的话)来说要重要得多,对于调用函数的程序员来说更重要,因为他们知道修改的值没有问题。但对于简单的值变量,它们无论如何都是副本,所以根本没有区别。
这实际上通常被用作正确性辅助,而不是任何编译器优化。如果您有一个pass-by-value,那么像这样将其标记为const
将防止您在想要其他参数时意外修改该参数。
即便如此,它仍然不是一种完全常见的形式
理论上,它可以使编译器从内存加载到寄存器中一次,避免重新读取值,但编译器通常可以在没有帮助的情况下自行解决这一问题,因为除非你特意对参数进行别名,否则编译器可以看到它在函数范围内的更新位置。
相关文章:
- C++:使用 param pack 显式调用函数重载
- 如何将类成员函数与param绑定为boost::function的右值
- C 结构化中的primitve/prientage datatypes
- 我可以创建一个可以接受任何枚举的模板(非类型)param类吗?C 11
- 我有这个单码字符串"Param�tres",è被转换为未知字符。
- 了解 void f(const T¶m) 中的参数类型
- 使用VERTH with vector :: push_back作为第一个param时,C 编译错误
- 为什么openfileName lptrfiletitle param a lpstr而不是lpcstr
- <func-param> 函数模板中的is_const始终返回 false
- 通过引用传递的param Vs的值的内存消耗
- 通过构造函数param实例化子类
- C++,实现函数"int next(std::string param)"时出现奇怪的编译器错误
- libcurl curl_easy_stopt long参数未正确传递-varg(param,long)
- 在子类中实现继承类的方法(param=指向父级的指针)(param=指向子级的指针)
- boost::p rogram_options 使用 -p 但不使用 --param
- Doxygen@param direction arguments[in],[out],[in,out]示例输出
- void foo(T<U>&& param) 中的通用参考
- c++.valgrind输出:Syscall param open(filename)指向不可修改的字节
- Qt QUrlQuery param split
- 一个很好的例子说明了如何使函数primitve param const导致编译器优化