[英]Strange GCC Behaviour
給出以下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在一種情況下歸零所有元素而不是另一種情況?
編輯:我使用以下編譯器標志: -std=c++0x
with g ++ 4.5.2。
如果你有自定義構造函數,編譯器應該為它創建的所有向量調用它。 如果您不編寫自己的,則默認為生成的構造函數。 但由於沒有類型是復雜的,它只是不需要調用它。 並且數組作為二進制中的常量表存儲。
嘗試內聯您的默認構造函數並將其清空。 當然,它可能只有在啟用優化時才有效
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.