对象内存布局问题

silverice 2008-09-19 11:57:12
如下代码,输出值为何是8?

#include <iostream>

using namespace std;

struct P
{
int x:3;
int y:3;
bool b:1;
};
void main()
{
cout<<sizeof(P)<<endl;
}
...全文
104 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xkyx_cn 2008-09-19
  • 打赏
  • 举报
回复
32系统,按4字节对齐很正常,一般来说为方便读写操作

这里的对齐还要参考结构体中字节数最大的成员类型

[Quote=引用 3 楼 lyle3 的回复:]
也不一定,编译器不一样,设置不一样都不一样,也可能是8字节的
[/Quote]
jia_xiaoxin 2008-09-19
  • 打赏
  • 举报
回复
为了提高CPU的存储速度,VC对一些变量的
起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结
构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。下面列出常用类型的
对齐方式(vc6.0,32位系统)。
类型 对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
Char 偏移量必须为sizeof(char)即1的倍数
Short 偏移量必须为sizeof(short)即2的倍数
int 偏移量必须为sizeof(int)即4的倍数
float 偏移量必须为sizeof(float)即4的倍数
double  偏移量必须为sizeof(double)即8的倍数
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对
齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边
界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员
变量申请空间后,还会根据需要自动填充空缺的字节。
lyle3 2008-09-19
  • 打赏
  • 举报
回复
也不一定,编译器不一样,设置不一样都不一样,也可能是8字节的
silverice 2008-09-19
  • 打赏
  • 举报
回复
我也这么想,刚才把bool型去掉就是4字节了
xkyx_cn 2008-09-19
  • 打赏
  • 举报
回复
默认4字节(sizeof(int))对齐,x,y在1个字节里面,b则因为类型不同,开始于另一个字节
mxm324 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xkyx_cn 的回复:]
默认4字节(sizeof(int))对齐,x,y在1个字节里面,b则因为类型不同,开始于另一个字节
[/Quote]
同意
xiangdingze 2008-09-19
  • 打赏
  • 举报
回复
非常想知道
高手请解答
xkyx_cn 2008-09-19
  • 打赏
  • 举报
回复
对于一般编译器,这2个结果都应为1,1个字节仅做占位用

[Quote=引用 6 楼 xiangdingze 的回复:]
Class p
{
};

sizeof(p)==?

struct P
{

};

sizeof(p) == ?
[/Quote]
xiangdingze 2008-09-19
  • 打赏
  • 举报
回复
Class p
{
};

sizeof(p)==?

struct P
{

};

sizeof(p) == ?


64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧