【发布时间】:2011-02-15 22:22:47
【问题描述】:
我有一个包含许多小内联函数的头文件。他们中的大多数碰巧都有恒定的数据。由于这些函数对性能至关重要,因此它们处理常量的方式变得很重要。 AFAIK 有两种方法可以引用常量:
1) 在一个单独的源文件中定义它们,该文件稍后会与应用程序链接。
2) 就地定义常量。
我会选择后一种方式,因为它更易于维护。但是,如果编译器不优化通过内联创建的数千个相等常量,它可能会更慢。
问题:
编译器会合并这些相等的常量吗?具体来说,将使用以下哪种方法?
1) 在编译单元中组合相等的常量。
2) 跨链接模块(整个程序或库)组合相等的常量
3) 将常量与 any 具有相同位模式并满足编译单元或整个程序的对齐要求的静态常量数据组合。
我使用现代编译器 (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);
}
【问题讨论】:
-
“就地定义常量”是什么意思?喜欢
const int i = 5;? -
是的。我所说的常量是指任何独立于函数参数的数据。
-
我不是 GCC 专家,但大多数编译器根本不组合 const 文字,除非它们是字符串文字。此外,const 文字通常作为立即值嵌入代码中。将值加载到内存变量中后,由编译器强制执行该值的 const-ness。
-
我认为您对使用 const 数据如何影响性能感到困惑;例如在“由于这些函数对性能至关重要,因此它们处理常量的方式变得很重要。”并且在“但是,如果编译器不优化通过内联创建的数千个相等常量,它可能会更慢。”
标签: c++ c gcc constants inline