Dato il seguente codice C++:strano GCC problem
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;
}
Quando ho aggiunto il (attualmente commentato) costruttori nella vertex_type
struct, bruscamente 10-15 secondo aumento nel tempo di compilazione. Bloccato, ho osservato l'assembly generato da gcc (utilizzando -S
) e ho notato che la dimensione del codice del codice era centinaia di volte più grande di prima.
...
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)
...
Ignorando la definizione del costruttore, l'assemblaggio generato era completamente diverso.
.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
Ovviamente c'è una differenza significativa nel codice generato dal compilatore. Perché è quello? Inoltre, perché gcc azzera tutti gli elementi in una situazione e non l'altra?
edit: Sto usando i seguenti flag di compilazione: -std=c++0x
con g ++ 4.5.2.
Questa è un'ipotesi, ma prova questo: vertex_type(): x(), y(), z() {} – Pubby
@ AlfP.Steinbach Questo è ESATTAMENTE il codice che ho nel mio file. Non c'è nient'altro Qualcuno di voi ha controllato il codice? Esso ha {}. È in linea ... – dcousens
@Alf i costruttori in questione sono commentati. – zwol