我有一个复杂的程序,其中对于很小的N值使用std :: array <double,N>
。 它使用operator []
从这些数组中获取值。
我发现GCC 6.1与 -O2
或 -O3
一起使用时不会内联这些调用,导致这些C ++数组比它们的C等效数组慢。
以下是生成的汇编代码:
340 <std::array<double, 8ul>::operator[](unsigned long) const>:
340: 48 8d 04 f7 lea (%rdi,%rsi,8),%rax
344: c3 retq
345: 90 nop
346: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
34d: 00 00 00
对于每个数组大小,都会发出完全相同的代码(因为没有边界检查)。
对这样一个数组的循环如下所示:
4c0: e8 7b fe ff ff callq 340 <std::array<double, 8ul>::operator[](unsigned long) const>
4c5: be 07 00 00 00 mov $0x7,%esi
4ca: 4c 89 f7 mov %r14,%rdi
4cd: 48 89 44 24 78 mov %rax,0x78(%rsp)
...6 more copies of this...
4d2: e8 69 fe ff ff callq 340 <std::array<double, 8ul>::operator[](unsigned long) const>
4d7: 48 89 44 24 70 mov %rax,0x70(%rsp)
4dc: 31 f6 xor %esi,%esi
4de: 4c 89 ef mov %r13,%rdi
这似乎是明显的不好。问题在于小型测试程序无法引发此行为。
因此,我的问题是:我如何让GCC告诉我为什么它没有内联这些一条指令的调用,并/或使其内联?显然,我不能修改<array>
头文件以添加__attribute__((inline))
。