簡單的答案是:它不是24字節。或者你正在運行Linux的64位s390端口,我還沒有找到ABI文檔。 Debian可以運行的每個其他64位硬件都將這個結構的大小設置爲16個字節。
我已經挖出了ABI文檔一羣不同CPU的ABI的,他們都有或多或少的這種措辭(看來他們都已經相互複製):
結構和聯合承擔對齊最嚴格對齊的組件。每個成員都分配到具有適當對齊的最低可用偏移量。任何對象的大小總是對象的對齊的倍數。
而且我發現所有架構ABI文檔(MIPS64,PPC64,AMD64,IA64,SPARC64,arm64)具有用於焦炭1對準,短2,INT 4和長長8.
即使操作系統允許自己製作ABI,幾乎每個類Unix系統,特別是Linux都遵循System V ABI及其補充的CPU文檔,這些文檔很好地說明了這種行爲。而Debian絕對不會改變這種行爲與所有其他Linux的不同。
這裏有一個快速驗證(全部在AMD64/x86_64的這就是你最有可能運行):
$ cat > foo.c
#include <stdio.h>
int
main(int argc, char **argv)
{
struct {
long long ll;
char ch2;
char ch1;
short s;
int i;
} foo;
printf("%d\n", (int)sizeof(foo));
return 0;
}
的MacOS:
$ cc -o foo foo.c && ./foo && uname -ms
16
Darwin x86_64
Ubuntu的:
$ cc -o foo foo.c && ./foo && uname -ms
16
Linux x86_64
CentOS:
$ cc -o foo foo.c && ./foo && uname -ms
16
Linux x86_64
OpenBSD系統:
$ cc -o foo foo.c && ./foo && uname -ms
16
OpenBSD amd64
還有別的東西錯了你的編譯。或者那不是你正在測試的結構,或者你正在一個非常奇怪的硬件架構上運行,並將其指定爲「64位」,相當於說「我駕駛的是政府頒發的車輛,並且它具有非常奇怪的加速和引擎5分鐘後切斷「,並沒有提到你在談論航天飛機。
來源
2014-11-25 15:42:14
Art
你在64位系統上檢查這個嗎?您還可以檢查成員的偏移量,以查看它們最終使用['offsetof'](http://en.cppreference.com/w/c/types/offsetof)宏的位置。關於標題中的措辭,編譯器選擇的對齊對於您的系統來說肯定是「合適的」。 – 2014-11-25 13:01:12
由於填充。 – bitcell 2014-11-25 13:02:42
什麼是「64位系統」?什麼是硬件架構?在x86_64 ABI上,該結構的大小應爲16個字節。我在Ubuntu,MacOS,OpenBSD和Centos上進行了驗證。它不依賴於編譯器,所以編譯標誌有些問題,或者你正在使用alpha或者其他奇怪的東西。 – Art 2014-11-25 14:12:29