我已多次阅读过,在C或C++代码中强制执行const-correctness不仅是一个关于可维护性的好习惯,而且它可能允许编译器执行优化.但是,我也完全相反 - 它根本不会影响性能.
因此,您是否有一些示例,其中const正确性可以帮助您的编译器提高程序的性能?
我知道在可能的情况下,在通过引用或指针传递参数时,应尽可能使用const关键字.如果我指定参数是常量,编译器可以做的任何优化吗?
可能有几种情况:
功能参数:
常量参考:
void foo(const SomeClass& obj)
Constant SomeClass对象:
void foo(const SomeClass* pObj)
并且指向SomeClass的常量指针:
void foo(SomeClass* const pObj)
变量声明:
const int i = 1234
函数声明:
const char* foo()
每个提供什么样的编译器优化(如果有的话)?
我已经阅读了关于C++中const-correctness的所有建议,并且它(部分)很重要,因为它有助于编译器优化代码.我从未见过的是关于编译器如何使用这些信息来优化代码的一个很好的解释,甚至连好书都没有解释幕后发生的事情.
例如,编译器如何优化声明为const的方法与不应该但应该是的方法.当你引入可变变量时会发生什么?它们会影响const方法的这些优化吗?
有没有人见过任何关于restrictgcc/g ++实际使用C/C++ 关键字的数字/分析是否能在现实中提供任何显着的性能提升(而不仅仅是在理论上)?
我已经阅读了各种推荐/贬低其使用的文章,但我没有碰到任何实际数字,实际上证明了任何一方的论点.
编辑
我知道这restrict不是C++的正式部分,但它得到了一些编译器的支持,我读过Christer Ericson的一篇论文,强烈推荐使用它.
我有一个指针int* p,并在循环中执行一些操作.我不修改内存,只是阅读.如果我添加const到指针(两种情况,const int* p和int* const p),它可以帮助编译器优化代码吗?
我知道其他优点const,比如安全或自我记录,我会问这个特例.重新提出问题:可以const给编译器任何有用的(用于优化)信息吗?
const声明是否有助于编译器(GCC)生成更快的代码,或者它们仅对可读性和正确性有用吗?
Zed Shaw认为const在C/C++中无用或过度使用:
接下来是const的所有奇怪的魅力.由于一些奇怪的原因,C++喜欢让你在声明的每个部分都使用const,但是我得到与C相同的最终结果:调用一个函数.(......)
(来自:http://librelist.com/browser//mongrel2/2010/7/15/c-verses-c++/#770d94bcfc6ddf1d8510199996b607dd)
如果有一个函数将指针struct作为参数,并且函数有一个循环,在每次迭代时访问一个成员,如:
int function_a(struct b *b)
{
    // ... do something then
    for(int i = 0; i < 500; ++i){
        b->c->d[i] = value();
    }
}
它是否会每次检索c指向的位置和d指向内存?
现在考虑以下情况:
int function_a(struct b *b)
{
    // ... do something then
    float *f = b->c->d;
    for(int i = 0; i < 500; ++i){
        f[i] = value();
    }
}
会更快吗?
情况就是这样,
我试图调查实现函数的一些优点/缺点,如下所示:
void foo(const int a, const int b)
{
    ...
}
使用通用函数原型作为API,它包含在头文件中,如下所示:
void foo(int a, int b)
我在下面的问题中找到了关于这个主题的大量讨论:
我同意rlerallut的回答,他说的是自我记录代码,并且在代码的安全性方面有点偏执.
然而,这是一个问题,有人在那里写道,使用const传递给函数的常用参数可以带来一些优化的好处.我的问题是,是否有人有现实生活中的例子来证明这一主张?