优化编译器的不断组合

8 c c++ gcc inline constants

我有一个包含许多小内联函数的头文件.他们中的大多数碰巧有不断的数据.由于这些函数对性能至关重要,因此它们处理常量的方式变得非常重要.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)

Dav*_*ser 8

根据GCC,以下选项可以满足您的需求:

-fmerge-constants

尝试跨编译单元合并相同的常量(字符串常量和浮点常量).如果汇编器和链接器支持,则此选项是优化编译的缺省选项.使用-fno-merge-constants可以禁止此行为.
在-O,-O2,-O3,-Os等级启用.