2016-12-01 205 views
2

看看這兩個結構嵌套結構中的數據如何存儲和填充?

struct parent_t 
{ 
    short num1; 
    char chrA; 
    char chrB; 
    char chr1; 
}; 

struct child_t 
{ 
    struct parent_t parent; 
    char chr2; 
}; 

正如我們所知,填充可能加入到結構成員,以便將其提高到一個舒適的RAM友好的大小。在parent_t的情況下,chr1可能會填充因爲它的微不足道。雖然chrAchrB可能會合並,並在RAM中共享相同的單詞。

現在,如果我們看看child_t,它有chr2,它本身會被填充。我的問題是chr1chr2是optomise如chrAchrB?如果是這樣,那叫什麼?

對於這個例子,我假設1字= 1短= 2個字符。

+3

我懷疑你的問題的答案是編譯器特定的。不同的編譯器可能會以不同的方式進行填充和對齊。你可以嘗試轉儲內存(使用地址和sizeof())並檢查。 – eyalm

+1

http://stackoverflow.com/questions/4306186/structure-padding-and-packing – John

+0

實際上,你會使用'offsetof'宏(這在所有環境中都不是標準的,但它足夠簡單以查找/實現)。是的,這絕對會根據您使用的編譯器進行更改。 – John

回答

1

我的問題是將chr1和chr2 optomise,如chrA和chrB?

不,他們不會按照您描述的方式進行優化。

原因是sizeof(struct parent_t)必須在程序中隨處可見。

如果它被優化的代碼會失敗:

struct parent_t p; 
struct child_t c; 
//... initialize p 
memcpy(&c.parent, &p, sizeof(struct parent_t)); 

這樣的代碼是有效的,必須工作。換句話說 - 你描述的優化不會發生。

+0

爲了完整起見,當一些編譯器可以證明結構的所有引用都是當前翻譯單元的本地時,它們會對結構的字段進行重新排序。但是這是非常罕見的,AFAIR在GCC和LLVM中都沒有。 – yugr