c++ - setup - tdm gcc debugger
Comportamiento extraño de GCC (2)
Esta es una optimización perdida de larga data en GCC . Debe ser capaz de generar el mismo código para ambos casos, pero no puede.
Sin los constructores, su vertex_type
es una estructura POD, en la que GCC puede inicializar instancias estáticas / globales en tiempo de compilación. Con los constructores, lo mejor que puede hacer es generar código para inicializar el inicio global del programa.
Dado el siguiente código de 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;
}
Cuando agregué los constructores (actualmente comentados) en la estructura vertex_type
, se incrementó abruptamente 10-15 segundos en el tiempo de compilación. Perplejo, miré el ensamblaje 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. ¿Porqué es eso? Además, ¿por qué gcc pone a cero todos los elementos en una situación y no la otra?
edición: estoy utilizando los siguientes indicadores del compilador: -std=c++0x
con g ++ 4.5.2.
Si tiene un constructor personalizado, el compilador debería llamarlo para todos los vectores que cree. Si no escribes el tuyo, se establece de forma predeterminada en un constructor generado. Pero como ningún tipo es complejo, simplemente no es necesario llamarlo. Y la matriz se almacena como una tabla constante en el binario.
Intenta alinear tu constructor por defecto y déjalo vacío. Por supuesto, solo puede funcionar con la optimización de h habilitada