Странное поведение 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 секунд. . Остановившись, я посмотрел на сборку, сгенерированную 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 обнуляет все элементы в одной ситуации, а не в другой?

edit: Я использую следующий компилятор флаги: -std = c ++ 0x с g ++ 4.5.2.

18
задан deceleratedcaviar 11 July 2013 в 16:08
поделиться