C11中const限定符的性能优势

时间:2015-04-21 03:39:01

标签: c performance const c11

“const”限定符的优点已在各种问题中进行了讨论,但这些讨论主要涉及无意识修改和意图清晰度的失败。我想问一下,由于使用了限定符,结果程序是否有任何差异 - 特别是,是否有性能提升?

在其他一个问题中,有人指出,如果在C ++中存在'const_cast'的情况下传递给具有const限定符的函数,则编译器不能使用不改变的对象的自然假设。那不是在C11中,那么const是否允许在没有它的情况下错过C11中的任何优化?

性能差异的另一种可能性是静态对象的内存布局。在只读空间中拥有对象有任何性能优势吗?这可能取决于硬件,我会对特定配置的一般见解和注释感兴趣。

编辑:要求提出一个通用论证,声称没有必要使用'const'的性能增益,这将是一个非常广泛的要求。然而,否定这一主张可能是一个相当简洁的回应。所以,更具体的是,在不排除任何解决我的一般问题的情况下,答案形式特别有用如下:

  1. 以必要的方式使用'const'实现性能增益的任何示例。

  2. 关于为什么编译器因为使用'const'而无法进行优化的任何争论。这可能不是特定于硬件的,因此如果是这种情况,可能会简明扼要地给出。如果需要更具体,我最感兴趣的是在函数调用中使用'const'。

  3. 关于只读内存是否可以与静态对象一起使用以在x86-64的桌面或服务器实现中实现性能提升的任何答案。

  4. 话虽这么说,但我很感激最初提出的问题的最一般答案是合理的。

1 个答案:

答案 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语义,编译器也可以进行优化。