我尝试编译以下函数,看看gcc编译器会产生什么:
#include <stdint.h>
#include <stddef.h>
typedef struct giga
{
uint64_t g[0x10000000];
} giga;
uint64_t addfst(giga const *gptr, size_t num)
{
uint64_t retval = 0;
for (size_t i = 0; i < num; i++)
{
retval += gptr[i].g[0];
}
return retval;
}
发现gcc占用了我的所有内存,把自己逼到了交换分区。
我发现这种情况发生在使用-O3
进行优化时,但我没有尝试分析具体的标志。在gcc.godbolt上测试该函数显示这是gcc特定的问题,影响4.8和4.9版本。
这是一个真正的编译器错误吗,还是我的函数有问题?
gcc版本4.8.2 20140120 (Red Hat 4.8.2-16) (GCC)
上。 - Jonathon Reinhart-O2 -ftree-vectorize
表现出这种行为,但没有-O2
就不会。 - Jonathon Reinhart4.9.2
上。 - edmz