sizeof问题

yaozhiyong110 2011-03-25 04:19:18
#pragma pack(8)
struct CIntData
{
short da;
int data;
};

struct CTest
{
char d;
CIntData b;
};

#pragma pack(0)

sizeof(CTest) 为12 sizeof(CIntData) 为8 为什么?

字节排列 d 0 0 0 da 0 0 0 data 0 0 0 为什么????(d 占 4字节 da 占4字节 data占4字节)
...全文
120 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
passerbythesun 2011-03-25
  • 打赏
  • 举报
回复
哇,我学习了
yaozhiyong110 2011-03-25
  • 打赏
  • 举报
回复
谢谢大家 搞那么久开发 字节对齐还没搞明白呢 惭愧....
zyyeung 2011-03-25
  • 打赏
  • 举报
回复
sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐
pengzhixi 2011-03-25
  • 打赏
  • 举报
回复
额 有几条规则是要注意的。

1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hairetz/archive/2009/04/16/4084088.aspx
yaozhiyong110 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yaozhiyong110 的回复:]
引用 6 楼 pengzhixi 的回复:
引用 2 楼 yaozhiyong110 的回复:
引用 1 楼 pengzhixi 的回复:
struct CTest
{
char d;
CIntData b;
};
char d后面有3个字节是用来对齐的。所以4+8=12


#pragma pack(8) 我不是让它8字节对齐了吗?

额,因为你所有的数据成员都没有大小……
[/Quote]

而且目前 只有double是8吧 那就是说 字节对齐不可能超过8喽? 不管你pack多少
最多就是8字节对齐??? 是这样吗
yaozhiyong110 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pengzhixi 的回复:]
引用 2 楼 yaozhiyong110 的回复:
引用 1 楼 pengzhixi 的回复:
struct CTest
{
char d;
CIntData b;
};
char d后面有3个字节是用来对齐的。所以4+8=12


#pragma pack(8) 我不是让它8字节对齐了吗?

额,因为你所有的数据成员都没有大小为8的,最大的Int是4,所以实际上还是按照4……
[/Quote]

那请教下 #pragma pack 还有什么意义呢? 意思是只准往低了对齐 不准往高对齐?
jackiesen 2011-03-25
  • 打赏
  • 举报
回复
32位机器: 需要补齐四位
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
charshort---~~~~double--------------------------char~~~~~~~~~~~~

~代表自动补齐的位
char a; 和
short b;
占4个字节
double c;
占8个字节
char d;
占4个字节
4+8+4=16

LZ自己算下!
vcgaoshou 2011-03-25
  • 打赏
  • 举报
回复
字符是4字节对齐的,并非每个字节都用
pengzhixi 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yaozhiyong110 的回复:]
引用 1 楼 pengzhixi 的回复:
struct CTest
{
char d;
CIntData b;
};
char d后面有3个字节是用来对齐的。所以4+8=12


#pragma pack(8) 我不是让它8字节对齐了吗?
[/Quote]
额,因为你所有的数据成员都没有大小为8的,最大的Int是4,所以实际上还是按照4字节对齐
xgy8705023 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yaozhiyong110 的回复:]
引用 1 楼 pengzhixi 的回复:
struct CTest
{
char d;
CIntData b;
};
char d后面有3个字节是用来对齐的。所以4+8=12


#pragma pack(8) 我不是让它8字节对齐了吗?
[/Quote]
对齐规则会根据自己与指定的数进行比较,按较小的对齐
lyingbo 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
struct CTest
{
char d;
CIntData b;
};
char d后面有3个字节是用来对齐的。所以4+8=12
[/Quote]

正解
xgy8705023 2011-03-25
  • 打赏
  • 举报
回复
会执行内存对齐
yaozhiyong110 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
struct CTest
{
char d;
CIntData b;
};
char d后面有3个字节是用来对齐的。所以4+8=12
[/Quote]

#pragma pack(8) 我不是让它8字节对齐了吗?
pengzhixi 2011-03-25
  • 打赏
  • 举报
回复
struct CTest
{
char d;
CIntData b;
};
char d后面有3个字节是用来对齐的。所以4+8=12

65,210

社区成员

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

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