结构成员如何存储在小端机器上?

时间:2011-03-27 15:10:33

标签: c

struct Dummy {
  int x;
  char y;
};

int main() {
  struct Dummy dum;
  dum.x = 10;
  dum.y = 'a';
}

如何在小端机器上构建成员的布局?

会是这样的吗?

  0x1000  +0   +1   +2   +3
         ___________________
    x:  | 10 |  0 |  0 |  0 |     
         -------------------       
    y:  | 'a'|  0 |  0 |  0 |
         -------------------
  0x1000  +4   +5   +6   +7 

3 个答案:

答案 0 :(得分:6)

我认为你会发现this question很有用。结束通常与记忆中的单词相关,而不是与整个结构相关。

答案 1 :(得分:4)

结构布局是一个编译器实现细节,受默认打包的影响。 Endianness 通常仅影响结构成员值中的字节顺序,而不影响布局。检查编译器手册中的小字或使用sizeof和offsetof宏进行实验。

您在问题中记录的布局对于32位LE编译器来说确实很常见。

答案 2 :(得分:1)

结构成员将按照声明的顺序,根据需要插入填充,以便每个字段正确对齐其类型,并在必要时在末尾插入填充,以便在数组中每个后续结构正确对齐并立即开始在前一个结构结束之后。也可能(但不太可能)在任何两个元素之间或最后插入额外的不必要的填充。

每个字段本身将根据编译器和体系结构的类型进行存储,例如: int 10将作为字节0a 00 00 00存储在具有32位整数的普通小端机器上。