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