c++ - 不断结合优化编译器

标签 c++ c gcc constants inline

我有一个包含很多小内联函数的头文件。他们中的大多数恰好有常量数据。由于这些函数对性能至关重要,因此它们处理常量的方式变得很重要。据我所知,有两种方法可以引用常量:

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);
}

最佳答案

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

-fmerge-constants

Attempt to merge identical constants (string constants and floating point constants) across compilation units. This option is the default for optimized compilation if the assembler and linker support it. Use -fno-merge-constants to inhibit this behavior.
Enabled at levels -O, -O2, -O3, -Os.

关于c++ - 不断结合优化编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5010216/

相关文章:

c - 为什么 `__builtin_{{s,u}{add,sub,mul}ll_overflow` 给出 `long int` 结果而不是 `long long int` 结果?

c++ - 使用函数求数组 C++ 的平均值

c++ - 错误 C2544 : expected ')' for operator '()'

在包含函数退出后通过其地址调用嵌套函数?

c - C编译器如何决定是调用库函数还是系统调用

GCC 4.7,包括 <stdatomic.h>

android - arm-eabi-gcc : No such file or directory in cyanogenmod source

c++ - getGravity 不起作用?

c++ - C++中类似Java的默认构造函数的含义

在 C 中更改二维动态数组的大小