【发布时间】:2017-02-16 02:08:02
【问题描述】:
我有一个复杂的程序,它使用std::array<double, N> 获取较小的 N 值。它使用 operator[] 从这些数组中获取值。
我发现带有 -O2 或 -O3 的 GCC 6.1 不会内联这些调用,导致这些 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))。
【问题讨论】:
-
提交一个针对 GCC 的错误?
-
@Brian:我不确定这是一个错误...我希望 GCC 中的一些启发式方法会使其认为这段代码实际上出于某种原因更好。这里的问题是如何让 GCC 告诉我它在想什么,和/或改变它。
-
但是如果您提交了一个错误,那么您可以让 GCC 开发人员向您解释它。 ;-)
标签: c++ c++11 gcc optimization inline