Rao*_*722 3 c memory struct sizeof
好吧,在用一个char,一个double,一个int读取这个结构的大小后,我仍然没有得到我的struct的大小:
struct s {
char c1[3];
long long k;
char c2;
char *pt;
char c3;
}
Run Code Online (Sandbox Code Playgroud)
并sizeof(struct s)回报我40
但根据我提到的帖子,我认为记忆应该是这样的:
0 1 2 3 4 5 6 7 8 9 a b c d e f
+-------------+- -+---------------------------+- - - - - - - -+
| c1 | |k | |
+-------------+- -+---------------------------+- - - - - - - -+
10 11 12 13 14 15 16 17
+---+- -+- -+- - - - - -+----+
|c2 | |pt | | c3 |
+---+- -+- -+- - - - - -+----+
Run Code Online (Sandbox Code Playgroud)
我应该18而不是40......有人可以向我解释我做错了什么吗?非常感谢你 !
假设一个8字节的指针大小和对齐要求long long和指针,那么:
c1kc2ptc3这相当于40个字节.
分配尾随填充,以便结构的数组保持结构的所有元素正确对齐.
请注意,大小,对齐要求以及填充因此取决于计算机硬件,编译器和平台的ABI(应用程序二进制接口).我使用的规则是通用规则:需要在N字节边界上分配N字节类型(对于{1,2,4,8,16}中的N).数组(在结构的结构和数组中)也需要正确对齐.你有时可以用#pragma指令填充; 要小心.通常最好在开始时布置具有最严格对齐的对象的结构,并且在末端布置不那么严格对齐的对象.
如果您使用:
struct s2 {
long long k;
char *pt;
char c1[3];
char c2;
char c3;
};
Run Code Online (Sandbox Code Playgroud)
所需的大小只有24个字节,只有3个字节的尾随填充.订单确实很重要!
| 归档时间: |
|
| 查看次数: |
1289 次 |
| 最近记录: |