struct
{
uint32_t i;
uint32_t i2;
}s;
printf("%p %p", &s.i, &s.i2);
如果上述打印的例子:字節序是否影響結構構件是如何存儲到存儲器
這意味着,最上面的部件到該結構位於較小的存儲器地址以及隨後的元素以遞增順序存儲在連續的地址處。
如果平臺排列順序顛倒了怎麼辦?這種模式會改變嗎? 這是在某個C標準的規範中某處提到的嗎?
struct
{
uint32_t i;
uint32_t i2;
}s;
printf("%p %p", &s.i, &s.i2);
如果上述打印的例子:字節序是否影響結構構件是如何存儲到存儲器
這意味着,最上面的部件到該結構位於較小的存儲器地址以及隨後的元素以遞增順序存儲在連續的地址處。
如果平臺排列順序顛倒了怎麼辦?這種模式會改變嗎? 這是在某個C標準的規範中某處提到的嗎?
字節順序的某個倍數並不是確定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
讓你把指針好像他們是整數;格式說明符%tu
將ptrdiff_t
值打印爲無符號數字。
你也可以做這樣的:
struct S {
uint32_t i;
uint32_t i2;
};
printf("%tu %tu\n", offsetof(struct S, i), offsetof(struct S, i2));
Endianness refers to the order of the bytes comprising a digital word in computer memory
Çstruct
不是一個數字字(它不是與CPU處理的實體),因此答案是否定的,字節序不影響結構構件是如何存儲到存儲器
什麼影響結構構件是如何存儲到存儲器是Data structure alignment,這可能會增加構件之間一些填充到對準構件地址以使其等於字大小
注意:術語「數字字」在C中沒有相關性。C中的字節順序以C的存儲器模型中連續的「字符」大小的單元格存儲整數類型的方式表示。 – 2016-08-17 09:10:01
@Rhymoid你是對的,這增加了理解endianness沒有連接到C.「數字詞」是維基百科中的_endianness_文章中使用的術語,我剛剛引用 – mvidelgauz
字節順序是指處理器自然類型內的字節順序:integers
和floats
。不管字節順序如何,struct
中的頂部元素總是會在內存中排在第一位。由於通常結構體被填充(字節對齊)依賴於編譯器等,因此您必須考慮這些差距。
結構成員的佈局是依賴於實現的,因此它可以在編譯器的品牌,選擇的優化模式和目標體系結構。但是,通常,endiannes是多字節類型中的字節順序(如int32
),因此它不應該影響多字節數據塊的順序。
字節順序不會影響成員的順序。
從N1570 6.7.2.1結構和聯合指示符:
- 如在6.2節中討論。在圖5中,結構是由組成的類型,其存儲按照有序序列分配,並且聯合是由存儲重疊的成員的序列 組成的類型。
雖然在成員之間和結構的結尾可能會有填充字節。
將錯誤類型傳遞給可變參數函數的未定義行爲。 – EOF
他/她意味着您的示例將不起作用,因此不會顯示任何內容。但是......儘管你的例子,你的問題仍然存在。 – noelicus
Endianess不應該有效果。結構的第一個元素的偏移量應始終爲零。每個下一個元素的偏移量應該大於其前一個元素的偏移量。 – PSkocik