我有一个包含许多小内联函数的头文件.他们中的大多数碰巧有不断的数据.由于这些函数对性能至关重要,因此它们处理常量的方式变得非常重要.AFAIK有两种方法可以引用常量:
1)将它们定义在稍后与应用程序链接的单独源文件中.
2)就地定义常数.
我会选择后一种方式,因为它更易于维护.但是,如果编译器没有优化内联创建的数千个相等常量,它可能会更慢.
问题:
编译器会结合这些相等的常量吗?特别是,将使用以下哪种方法?
1)在编译单元中组合相等的常量.
2)在链接模块(整个程序或库)中组合相等的常量
3)将常量与恰好具有相同位模式的任何静态常量数据组合,并满足编译单元或整个程序的对齐要求.
我使用现代编译器(GCC4.5).
我不是汇编程序的专家,因此我无法使用几个简单的测试自己回答这个问题:)
编辑:
常量非常大(大多数至少为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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1704 次 |
| 最近记录: |