sizeof的问题

yuwei19840916 2009-02-24 10:12:19
在下述代码中,为什么sizeof(R)=20;sizeof(T)=24;sizeof(u)=28,实在是有点不理解?望高手解答
struct X
{
char m_ch;
char *m_pStr;
};
struct Y
{
bool m_ok;
char m_name[6];
};

struct R
{
char m_ch;
double m_width;
char m_name[6];
};

struct T
{
int m_no;
R m_r;
};

struct U
{
bool m_ok;
T m_t;
};

int main(int argc,char *argv[])
{
cout<<sizeof(X)<<endl;
cout<<sizeof(Y)<<endl;
cout<<"R:"<<sizeof(R)<<endl;
cout<<"T:"<<sizeof(T)<<endl;
cout<<"U:"<<sizeof(U)<<endl;
}
...全文
132 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tracycln 2009-02-24
  • 打赏
  • 举报
回复
依据你给出的结果,我觉得你的电脑是4字节对齐的:
struct R
{
char m_ch; //本来是1 - 由于后面的double是8,所以变成4字节对齐,所以是4
double m_width; //8
char m_name[6]; // 6 -> 8
};

4+8+8 = 20 //在我的电脑上测出的值是16 -> 2+8+6 因为我的电脑是2字节对其的

struct T
{
int m_no; //4
R m_r; //20
};

4+ 20 = 24

struct U
{
bool m_ok; //4 ,为了对齐
T m_t; //24
};

4+24 = 28

所以你定义数据的时候要注意了,要尽量遵循对齐的原则,这样,既节省空间,又提高程序的执行效率
chenzhp 2009-02-24
  • 打赏
  • 举报
回复
Win32平台下的微软 编译器(cl.exe for 80×86)的对齐策略:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
备注:为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字节,以达到整数倍的要求,也就是将预开辟空间的首地址后移几个字节。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节(trailing padding)。
备注:结构体总大小是包括填充字节,最后一个成员满足上面两条以外,还必须满足第三条,否则就必须在最后填充几个字节以达到本条要求。
waizqfor 2009-02-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 yuwei19840916 的帖子:]
在下述代码中,为什么sizeof(R)=20;sizeof(T)=24;sizeof(u)=28,实在是有点不理解?望高手解答
struct X
{
char m_ch;
char *m_pStr;
};
struct Y
{
bool m_ok;
char m_name[6];
};

struct R
{
char m_ch;
double m_width;
char m_name[6];
};

struct T
{
int m_no;
R m_r;
};

struct U
{
bool m_ok;
T m_t;
};

int main(int argc,char *argv[])
{
co…
[/Quote]
http://www.yuanma.org/data/2006/0723/article_1213.htmLZ看看这个 了解下结构体字节对齐问题
tracycln 2009-02-24
  • 打赏
  • 举报
回复
这是由内存对其造成的,这个因电脑环境不同而异。
测出这样的结果,说明的你的电脑的是4字节对齐的。
  • 打赏
  • 举报
回复
结构体的字节对齐,自己搜索一下吧,不难的.
taodm 2009-02-24
  • 打赏
  • 举报
回复
自己google “对齐”
herman~~ 2009-02-24
  • 打赏
  • 举报
回复
对齐问题

64,682

社区成员

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

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