返回信息流struct st{
int i;
short s;
char c;
}a;
cout << sizeof(a) << endl;
输出是8,为啥?~初学者啊初学者~呵呵
这是一条镜像帖。来源:北邮人论坛 / cpp / #29418同步于 2009/10/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[]求助各位大牛,请指点~~
punkboy
2009/10/7镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 punkboy 的大作中提到: 】
: struct st{
: int i;
: short s;
: ...................
对齐。大小对齐到结构中占用字节最大的那个成员的整数倍。
内存对齐啊内存对齐~~~
【 在 punkboy (终结此夜) 的大作中提到: 】
: struct st{
: int i;
: short s;
: ...................
PC机是32位对齐的,i占32位,已对齐,s占16位,c占8位,s+c共占24位,离32位差8位,补8位零对齐,得到第二个32位。sizeof()之后等于64位/8=8字节
【 在 josephbupt 的大作中提到: 】
: PC机是32位对齐的,i占32位,已对齐,s占16位,c占8位,s+c共占24位,离32位差8位,补8位零对齐,得到第二个32位。sizeof()之后等于64位/8=8字节
更深入点的我来讲下:
为什么要对齐呢?其实都是为了效率问题。当然了,对于一些risc来说,内存不对齐可能意味着异常的发生。但对于cisc则是效率会减少。
拿奔腾来说,数据线是64位,一次内存读取可以读取8字节。假设现在读取4字节的数据的地址出现在不对齐的地址上,则可能要出现读取两次内存才能得到这4节,所以效率就很低了。
我记得的是旧式PC机内存总线的宽度是32位,只要CPU总线大于32位并支持非对齐访问,都可以用32位对齐来做到空间换时间,可见决定32位对齐的并不是64位的CPU数据线而是32位的内存总线。
【 在 jmpesp 的大作中提到: 】
: 更深入点的我来讲下:
: 为什么要对齐呢?其实都是为了效率问题。当然了,对于一些risc来说,内存不对齐可能意味着异常的发生。但对于cisc则是效率会减少。
: 拿奔腾来说,数据线是64位,一次内存读取可以读取8字节。假设现在读取4字节的数据的地址出现在不对齐的地址上,则可能要出现读取两次内存才能得到这4节,所以效率就很低了。
【 在 josephbupt 的大作中提到: 】
: 我记得的是旧式PC机内存总线的宽度是32位,只要CPU总线大于32位并支持非对齐访问,都可以用32位对齐来做到空间换时间,可见决定32位对齐的并不是64位的CPU数据线而是32位的内存总线。
其实这跟数据线宽度是多少本身并无太多联系,我这边举出64位只是说明一个特例。其实只要数据宽度不是8位,对齐都是必要的,否则就可能出现效率问题