const的正确性能提高性能吗?

我已经读过无数次,在C或C ++代码中强制执行const-correctness不仅是可维护性的一个良好实践,而且还可以让您的编译器执行优化。 不过,我也读过完全相反的东西 – 它根本不影响性能。

因此,你有没有常量正确性可以帮助你的编译器提高你的程序性能的例子?

const正确性不能提高性能,因为const_castmutable在语言中,并允许代码一致地打破规则。 这在C ++ 11中变得更糟,你的const数据可能是指向std::atomic的指针,这意味着编译器必须尊重其他线程所做的更改。

也就是说,编译器查看它生成的代码并确定它是否实际写入给定的variables并相应地应用优化是微不足道的。

这一切都说, const正确性在可维护性方面是一件好事。 否则,你的class级的客户可能会打破该class级的内部成员。 例如,考虑标准的std::string::c_str() – 如果它不能返回一个常量值,那么你就可以使用string的内部缓冲区了!

性能方面不要使用const 。 出于可维护性原因使用它。

是的,它可以。

大多数const纯粹是为了程序员的利益,并不会帮助编译器进行优化,因为将它们丢弃是合法的,所以它们不会告诉编译器任何有用的优化。 然而,一些const不能被合法地抛弃,这些提供给编译器有用的信息来优化。

作为一个例子,访问一个用consttypes定义的全局variables可以内联,而没有consttypes的variables不能内联,因为它可能在运行时改变。

https://godbolt.org/g/UEX4NB

C ++:

 int foo1 = 1; const int foo2 = 2; int get_foo1() { return foo1; } int get_foo2() { return foo2; } 

ASM:

 foo1: .long 1 foo2: .long 2 get_foo1(): push rbp mov rbp, rsp mov eax, DWORD PTR foo1[rip] ; foo1 must be accessed by address pop rbp ret get_foo2(): push rbp mov rbp, rsp mov eax, 2 ; foo2 has been replaced with an immediate 2 pop rbp ret 

实际上,请记住,虽然const可以提高性能,但在大多数情况下,它不会或不会,但变化不会引人注意。 const的主要用处不是优化。


史蒂夫·杰索普(Steve Jessop)在对原始问题的评论中又举了一个例子,提出了值得一提的东西。 在一个块范围内,编译器可以推断出一个variables是否会被突变并相应地进行优化,而不pipeconst ,因为编译器可以看到variables的所有用途。 相反,在上面的例子中,不可能预测foo1是否会被突变,因为它可以在其他翻译单元中被修改。 我假设一个假想的超级编译器可以分析整个程序,并确定是否有效的内联访问foo1 …但真正的编译器不能。

根据我的经验,没有

对于标量variables,编译器能够确定每当值发生变化时自行执行必要的优化。

对于数组指针,常量的正确性并不能保证在存在潜在的混叠问题的情况下值是真正的常量。 因此,编译器不能单独使用const修饰符来执行优化

如果你正在寻找优化,你应该考虑__restrict__或特殊function修饰符/属性: http : //gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

有点旧,但仍然适用: http : //www.gotw.ca/gotw/081.htm还有一些: http : //cpp-next.com/archive/2009/08/want-speed-pass-by -值/