BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #29933同步于 2009/10/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

结构体字节大小怎么计算

cranberry
2009/10/14镜像同步8 回复
#include <iostream> using namespace std; void main() { struct st { char a; short b; char c; long d; }st1; cout << sizeof(st1); } 我怎么觉得输出8呢,(win32系统,vc编译器)
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
hs机器人#1 · 2009/10/14
请google内存对齐
ding328机器人#2 · 2009/10/14
【 在 cranberry 的大作中提到: 】 : #include <iostream> : using namespace std; : void main() : ................... 他们在内存中存储的开始位置分别为 0 2 4 8 应该是后一个与前面的对齐,如果你的第二个char和short换个位置就是8 即 0 1 2 4
cranberry机器人#3 · 2009/10/14
不太理解“后一个与前面的对齐”,把long换到最前面,还是8 【 在 ding328 的大作中提到: 】 : 他们在内存中存储的开始位置分别为 0 2 4 8 : 应该是后一个与前面的对齐,如果你的第二个char和short换个位置就是8 : 即 0 1 2 4
AFX机器人#4 · 2009/10/14
http://hi.baidu.com/hixmuhot/blog/item/3d3f19df5684b25e94ee37e2.html
ImageP机器人#5 · 2009/10/14
又是sizeof的问题!!! 怎么可能是8 呢?!! 明显是 12 嘛! char a; short b; char c; long d; 我们可以看到同类型的 a, c不是连续分配的! 我们又可以看到 有一个long类型(4个字节, win32 也就是以4字节--int , 为基准) 那么就以long为基准, 只要满足long的整数倍, 就ok了, 如果不满足就补齐! 那么就是 ( 1 + 1 + 2 ) + (1 + 3) + 4 = 12 // (**) 说明: 其中第一个括号中的 第二个 1是为了保证 char a 补齐 第二个括号中的 3 是 为了满足 char c 补齐 如果我们将char c; 放到 char a;的后面那么, a, c为同类型且连续分配,所以他们内存分配也连续,就是说 char c将取代 (**) 式子中第一个括号中的第二个 1 的位置。 这样就没有 ( 1 + 3) 这个项了。 char a; char c; short b; long d; 所以: 这样求出的 sizeof 就是: ( 1 + 1 + 2 ) + 4 = 8 【 在 cranberry 的大作中提到: 】 #include <iostream> using namespace std; void main() { struct st { char a; short b; char c; long d; }st1; cout << sizeof(st1); } 我怎么觉得输出8呢,(win32系统,vc编译器)
laser机器人#6 · 2009/10/15
Win32的内存对齐系数是4 结构体安排第一个数据的位置从offset 0开始 a的大小是 1 1<4 所以按照1对齐 offset=0 [0] 0是1的整数倍 b的大小是 2 2<4 所以按照2对齐 offset=2 [2,3] 2是2的整数倍 c的大小是 1 1<4 所以按照1对齐 offset=3 [4] 4是1的整数倍 d的大小是 4 4=4 所以按照4对齐 offset=8 [8,11] 8是4的整数倍 所以总共是12个字节
youziboy机器人#7 · 2009/10/15
ImageP 和 laser 结果是一样,但是分析过程不一样吧?
FadeToBlack机器人#8 · 2009/10/15
对齐问题x86请参见intel abi