改善32位机器上的结构的内存对齐

时间:2013-10-21 04:55:45

标签: c memory padding

纠正下方结构的对齐情况。

typedef struct{ 
char *string; // 4 byte (type of address int)

char temp; // 1 byte

short pick; // 2 byte

char temp2; // 1 byte

}hello;
  • string = 4
  • temp + pick + temp2(offset 7)= 1 + 2 + 1

给出答案,良好的对齐是

char *string; // 4 byte (type of address int)

short pick; // 2 byte

char temp; // 1 byte

char temp2; // 1 byte
  • string = 4
  • pick + temp + temp2(offset 7)= 2 + 1 + 1

无法理解temp2应该偏移7而不是8的原因怎么样?请帮忙

1 个答案:

答案 0 :(得分:0)

+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
|    string     | pick  | t1| t2|
+---+---+---+---+---+---+---+---+

t1使用tempt2使用temp2,这是修改后的布局。 t2的偏移量为7。

对于n字节数量为n字节对齐的系统上的原始结构,布局为:

+---+---+---+---+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B |
+---+---+---+---+---+---+---+---+---+---+---+---+
|    string     | t1|pad| pick  | t2|pad|pad|pad|
+---+---+---+---+---+---+---+---+---+---+---+---+

那是因为4字节指针需要4字节对齐,所以结构数组需要每个成员都是4字节的倍数。

因此,在原始结构中,t2的偏移量应为8,而不是7。