我有一个包含许多小型内联函数的头文件。他们中的大多数碰巧拥有恒定的数据。由于这些函数对性能至关重要,因此它们处理常量的方式变得很重要。 AFAIK 有两种方法来引用常量:
1) 在稍后与应用程序链接的单独源文件中定义它们。
2) 就地定义常量。
我会选择后一种方式,因为它更易于维护。但是,如果编译器不优化通过内联创建的数千个相等常量,则速度可能会更慢。
问题:
编译器会合并这些相等的常量吗?特别是,将使用以下哪种方法?
1) 跨编译单元的相等常量的组合。
2) 跨链接模块(整个程序或库)组合相等常量
3) 将常数与any恰好具有相同位模式并满足整个编译单元或整个程序的对齐要求的静态常量数据。
我使用现代编译器(GCC4.5)。
我不是汇编专家,因此我无法使用几个简单的测试来回答这个问题:)
EDIT:
这些常量非常大(大多数至少有 16 个字节),因此编译器无法将它们设为立即值。
EDIT2:
代码示例
这个就地使用常量:
float_4 sign(float_4 a)
{
const __attribute__((aligned(16))) float mask[4] = { //I use a macro for this line
0x80000000, 0x80000000, 0x80000000, 0x80000000};
const int128 mask = load(mask);
return b_and(a, mask);
}
根据GCC http://gcc.gnu.org/onlinedocs/gcc-4.5.0/gcc/Optimize-Options.html以下选项可以满足您的要求:
-fmerge-常量
尝试跨编译单元合并相同的常量(字符串常量和浮点常量)。
如果汇编器和链接器支持,则此选项是优化编译的默认选项。使用 -fno-merge-constants 来抑制此行为。
在-O、-O2、-O3、-Os 级别启用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)