2010-11-07 21 views
0

考慮在64位,這些結構:數據對齊和繼承問題

struct base 
{ 
    long a; 
}; 

struct derived : public base 
{ 
    long b; 
    char c; 
}; 

我得到一個大小爲24和填充警告,但我不明白爲什麼。 對我來說,用這種繼承的數據排列像

a 
b 
c 

所以一個是在8對齊,B也和c是char和1 對準那麼在這裏,這是爲什麼問題大小是24?

+1

請同時發佈您正在使用的編譯器和確切的警告消息。 – 2010-11-07 22:28:23

+0

「填充警告」是什麼意思? – jalf 2010-11-07 23:50:21

回答

1

有時編譯器會選擇使用所有元素的字大小來提高運行速度。例如,在GCC中,您可以強制使用

__attribute__((packed)) 

到結構體定義。你可以學習this GCC documenation。但是,我不確定在使用繼承時可以使用什麼關於對齊的假設。特別是,如果您使用虛函數,則由於將某些指針添加到結構中,大小可能會改變。

8

大小爲24,因此當您製作struct derived的數組時,數組的第二個元素將具有8字節的對齊方式,即base::a

+0

+1:我當然沒有考慮過這種可能性。 – Puppy 2010-11-07 23:06:17

+0

啊,這是一個結構對齊!謝謝 ! – fedj 2010-11-08 10:28:22