2014-02-08 57 views
2

我從E.S.R The Lost Art of C Structure Packing閱讀這篇文章,代碼如下(從packtest.c摘錄):gcc pack-struct會決定添加多少個填充到結構中?

$ cat p.c 
#include <stdio.h> 

struct foo5 { 
    short s; 
    char c; 
    int flip:1; 
    int nybble:4; 
    int septet:7; 
}; 

main(int argc, char *argv) 
{ 
    printf("sizeof(struct foo5) = %zu\n", sizeof(struct foo5)); 
} 
$ gcc -Wpadded -o p p.c 
p.c:9:1: warning: padding struct size to alignment boundary [-Wpadded] 
}; 
^ 
$ ./p 
sizeof(struct foo5) = 8 
$ gcc -Wpadded -fpack-struct=2 -o p p.c 
p.c:9:1: warning: padding struct size to alignment boundary [-Wpadded] 
}; 
^ 
$ ./p 
sizeof(struct foo5) = 6 

那麼有多少尾隨填充到結構將會給出不同的包裝,結構尺寸?我怎麼能用pahole來看看究竟有多少填充?默認的包結構值是8 bytes

+0

我發現你已經聲明瞭一個(靜態分配在堆棧上)像這樣的'struct foo5 f5;'來獲得pahole的工作,否則pahole將不報告任何內容。 – schemacs

回答

0

這似乎不是'拖尾填充'。 C99說:

實現可分配任何可尋址存儲單元大 足以容納一個位域。

在你的結構中,位域不需要4個字節。

我猜pahole沒有看到結構,因爲程序沒有這些信息。 sizeof運算符得到一個常量,以便不需要信息。您可以在gdb中嘗試info types'以查看該類型是否可用。

+0

'pahole'需要'libelf'和'libdw'來完成工作,可能只是分析調試信息沒有被剝離。所以如果沒有聲明結構變量,它會發現沒有用的關於填充(編譯器做了什麼)? – schemacs