c++ 奇怪的GCC行为

给出以下C代码:

struct vertex_type {
    float x, y, z;

    //vertex_type() {}
    //vertex_type(float x, float y, float z) : x(x), y(y), z(z) {}
};

typedef struct {
    vertex_type vertex[10000];
} obj_type;

obj_type cube = {
    {
        {-1, -1, -1},
        {1, -1, -1},
        {-1, 1, -1},
        {1, 1, -1},

        {-1, -1, 1},
        {1, -1, 1},
        {-1, 1, 1},
        {1, 1, 1}
    }
};

int main() {
    return 0;
}

当我将(当前注释掉的)构造函数添加到vertex_type结构体中时,编译时间突然上升了10-15秒。
Stumped,我看到gcc(使用-S)生成的程序集,并注意到代码大小是以前的几百倍。

...
movl    $0x3f800000, cube+84(%rip)
movl    $0x3f800000, cube+88(%rip)
movl    $0x3f800000, cube+92(%rip)
movl    $0x00000000, cube+96(%rip)
...
movl    $0x00000000, cube+119996(%rip)
...

通过省略构造函数定义,生成的程序集完全不同。

.globl cube
    .data
    .align 32
    .type   cube, @object
    .size   cube, 120
cube:
    .long   3212836864
    .long   3212836864
    .long   3212836864
    .long   1065353216
    .long   3212836864
    .long   3212836864
    .long   3212836864
    .long   1065353216
    .long   3212836864
    .long   1065353216
    .long   1065353216
    .long   3212836864
    .long   3212836864
    .long   3212836864
    .long   1065353216
    .long   1065353216
    .long   3212836864
    .long   1065353216
    .long   3212836864
    .long   1065353216
    .long   1065353216
    .long   1065353216
    .long   1065353216
    .long   1065353216
    .zero   24
    .text

显然编译器生成的代码有很大差异。
这是为什么?
另外,为什么gcc在一种情况下将所有元素置零,而不是其他元素?

编辑:
我使用以下编译器标志:-std = c 0x与g 4.5.2。

这是一个长期的missing optimization in GCC.它应该能够为这两种情况生成相同的代码,但它不能。

没有构造函数,您的vertex_type是一个POD结构,GCC可以在编译时初始化静态/全局实例。使用构造函数,最好的方法是在程序启动时生成代码来初始化全局。

翻译自:https://stackoverflow.com/questions/7670110/strange-gcc-behaviour

转载注明原文:c++ 奇怪的GCC行为