簡體   English   中英

奇怪的GCC行為

[英]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。

這是海灣合作委員會長期缺失的優化 應該能夠為兩種情況生成相同的代碼,但它不能。

沒有構造函數,你的vertex_type是一個POD結構,GCC可以在編譯時初始化靜態/全局實例。 使用構造函數,它可以做的最好的事情是生成代碼以在程序啟動時初始化全局。

如果你有自定義構造函數,編譯器應該為它創建的所有向量調用它。 如果您不編寫自己的,則默認為生成的構造函數。 但由於沒有類型是復雜的,它只是不需要調用它。 並且數組作為二進制中的常量表存儲。

嘗試內聯您的默認構造函數並將其清空。 當然,它可能只有在啟用優化時才有效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM