我有一个包含许多小内联函数的头文件。其中大部分都包含常量数据。由于这些函数对性能至关重要,它们处理常量的方式变得很重要。据我所知,有两种方法可以引用常量:
1)在单独的源文件中定义它们,然后将其与应用程序链接。
2)直接定义常量。
我选择后者,因为它更易于维护。但是,如果编译器没有优化通过内联创建的成千上万个相等常量,那么它可能会变慢。
问题是:编译器是否会组合这些相等的常量?特别是将使用以下哪种方法:
1)跨编译单元组合相等的常量。
2)跨链接模块(整个程序或库)组合相等的常量。
3)将常量与任何具有相同位模式并满足编译单元或整个程序中的对齐要求的静态常量数据组合。
我使用现代编译器(GCC4.5)。
我不是汇编专家,因此我无法使用几个简单的测试来回答这个问题 :)
编辑:
这些常量相当大(其中大部分至少为16字节),因此编译器无法使它们成为立即值。
编辑2:
代码示例:
这个使用常量:
1)在单独的源文件中定义它们,然后将其与应用程序链接。
2)直接定义常量。
我选择后者,因为它更易于维护。但是,如果编译器没有优化通过内联创建的成千上万个相等常量,那么它可能会变慢。
问题是:编译器是否会组合这些相等的常量?特别是将使用以下哪种方法:
1)跨编译单元组合相等的常量。
2)跨链接模块(整个程序或库)组合相等的常量。
3)将常量与任何具有相同位模式并满足编译单元或整个程序中的对齐要求的静态常量数据组合。
我使用现代编译器(GCC4.5)。
我不是汇编专家,因此我无法使用几个简单的测试来回答这个问题 :)
编辑:
这些常量相当大(其中大部分至少为16字节),因此编译器无法使它们成为立即值。
编辑2:
代码示例:
这个使用常量:
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);
}
const int i = 5;
这样吗? - ThomasMcLeod