2016-08-17 74 views
4
struct 
{ 
    uint32_t i; 
    uint32_t i2; 
}s; 
printf("%p %p", &s.i, &s.i2); 

如果上述打印的例子:字節序是否影響結構構件是如何存儲到存儲器

這意味着,最上面的部件到該結構位於較小的存​​儲器地址以及隨後的元素以遞增順序存儲在連續的地址處。

如果平臺排列順序顛倒了怎麼辦?這種模式會改變嗎? 這是在某個C標準的規範中某處提到的嗎?

+1

將錯誤類型傳遞給可變參數函數的未定義行爲。 – EOF

+0

他/她意味着您的示例將不起作用,因此不會顯示任何內容。但是......儘管你的例子,你的問題仍然存在。 – noelicus

+0

Endianess不應該有效果。結構的第一個元素的偏移量應始終爲零。每個下一個元素的偏移量應該大於其前一個元素的偏移量。 – PSkocik

回答

5

字節順序的某個倍數並不是確定struct成員的抵消的過程中的因素。初始成員將始終以偏移零分配;其他成員將按照它們在struct聲明中出現的順序以較高的偏移量進行分配。

系統無關的方式來編寫你的程序如下:

struct { 
    uint32_t i; 
    uint32_t i2; 
}s; 
intptr_t p = (intptr_t)&s; 
intptr_t pi = (intptr_t)&s.i; 
intptr_t pi2 = (intptr_t)&s.i2; 
printf("%tu %tu\n", pi-p, pi2-p); 

Demo 1.intptr_t讓你把指針好像他們是整數;格式說明符%tuptrdiff_t值打印爲無符號數字。

你也可以做這樣的:

struct S { 
    uint32_t i; 
    uint32_t i2; 
}; 
printf("%tu %tu\n", offsetof(struct S, i), offsetof(struct S, i2)); 

Demo 2

5

Endianness refers to the order of the bytes comprising a digital word in computer memory

Çstruct不是一個數字字(它不是與CPU處理的實體),因此答案是否定的,字節序不影響結構構件是如何存儲到存儲器

什麼影響結構構件是如何存儲到存儲器是Data structure alignment,這可能會增加構件之間一些填充到對準構件地址以使其等於字大小

+1

注意:術語「數字字」在C中沒有相關性。C中的字節順序以C的存儲器模型中連續的「字符」大小的單元格存儲整數類型的方式表示。 – 2016-08-17 09:10:01

+0

@Rhymoid你是對的,這增加了理解endianness沒有連接到C.「數字詞」是維基百科中的_endianness_文章中使用的術語,我剛剛引用 – mvidelgauz

1

字節順序是指處理器自然類型內的字節順序:integersfloats。不管字節順序如何,struct中的頂部元素總是會在內存中排在第一位。由於通常結構體被填充(字節對齊)依賴於編譯器等,因此您必須考慮這些差距。

0

結構成員的佈局是依賴於實現的,因此它可以在編譯器的品牌,選擇的優化模式和目標體系結構。但是,通常,endiannes是多字節類型中的字節順序(如int32),因此它不應該影響多字節數據塊的順序。

2

字節順序不會影響成員的順序。

從N1570 6.7.2.1結構和聯合指示符:

  • 如在6.2節中討論。在圖5中,結構是由組成的類型,其存儲按照有序序列分配,並且聯合是由存儲重疊的成員的序列 組成的類型。
  • 雖然在成員之間和結構的結尾可能會有填充字節。