Dado el siguiente código C++:Strange GCC Comportamiento
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;
}
Cuando añadí la (actualmente comentado) constructores en el vertex_type
struct, abruptamente 10-15 segundos aumento en tiempo de compilación. Stumped, miré al ensamblado generado por gcc (usando -S
) y noté que el tamaño del código gen era varios cientos de veces más grande que antes.
...
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)
...
Al omitir la definición del constructor, el ensamblaje generado fue completamente diferente.
.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
Obviamente, hay una diferencia significativa en el código generado por el compilador. ¿Por qué es eso? Además, ¿por qué gcc pone a cero todos los elementos en una situación y no en la otra?
edición: estoy usando las siguientes opciones del compilador: -std=c++0x
con g ++ 4.5.2.
Esto es una suposición descabellada, pero intente esto: tipo_vertex(): x(), y(), z() {} – Pubby
@ AlfP.Steinbach Esto es EXACTAMENTE el código que tengo en mi archivo. No hay nada más. ¿Alguno de ustedes revisó el código? Tiene {}. Está en línea ... – dcousens
@Alf los constructores en cuestión están comentados. – zwol