“const”限定符的优点已在各种问题中进行了讨论,但这些讨论主要涉及无意识修改和意图清晰度的失败。我想问一下,由于使用了限定符,结果程序是否有任何差异 - 特别是,是否有性能提升?
在其他一个问题中,有人指出,如果在C ++中存在'const_cast'的情况下传递给具有const限定符的函数,则编译器不能使用不改变的对象的自然假设。那不是在C11中,那么const是否允许在没有它的情况下错过C11中的任何优化?
性能差异的另一种可能性是静态对象的内存布局。在只读空间中拥有对象有任何性能优势吗?这可能取决于硬件,我会对特定配置的一般见解和注释感兴趣。
编辑:要求提出一个通用论证,声称没有必要使用'const'的性能增益,这将是一个非常广泛的要求。然而,否定这一主张可能是一个相当简洁的回应。所以,更具体的是,在不排除任何解决我的一般问题的情况下,答案形式特别有用如下:
以必要的方式使用'const'实现性能增益的任何示例。
关于为什么编译器因为使用'const'而无法进行优化的任何争论。这可能不是特定于硬件的,因此如果是这种情况,可能会简明扼要地给出。如果需要更具体,我最感兴趣的是在函数调用中使用'const'。
关于只读内存是否可以与静态对象一起使用以在x86-64的桌面或服务器实现中实现性能提升的任何答案。
话虽这么说,但我很感激最初提出的问题的最一般答案是合理的。
答案 0 :(得分:4)
我想原则上,当代码有很多const
限定符时,编译器可以优化更多。
我想通过以下代码:
extern void foo(const int*const);
int bar(const int*const arr) {
int k = arr[0];
foo(arr);
return k+arr[0];
}
一个聪明的优化编译器只能加载arr[0]
一次(并将k
保持在本地跨foo
的调用中
看起来gcc-4.9
无法(或不愿意)进行此类优化,但clang-3.5
正在优化它(在Linux / x86-64上都使用-O3 -fverbose-asm
)。< / p>
顺便说一句,它不是特定于C11,我相信使用C99语义,编译器也可以进行优化。