注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

hhfighting的博客

以责人之心责己,以恕己之心恕人

 
 
 

日志

 
 
 
 

结构体的内存分配问题  

2010-08-01 11:37:28|  分类: 专业知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

#pragma pack(8)
struct example1
{
     short a;
     long b;
};
struct example2
{
     char c;
     example1 struct1;
     short e;
};
#pragma pack()

int main()

{
      example2 struct2;
      cout << sizeof(example1) << " ";
      cout << sizeof(example2) <<  " "; 
      cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2) << endl;

      getchar();

      return 0;
}

程序输出结果是:8  16  4

程序分析:

1、example1结构体来说:short和long,其中short占两个字节,long占四个字节,由于对齐原则,故sizeof(example1)占8个字节。

2、example2结构体来说:char、example1和short,其中char占一个字节,example1占8个字节,short占两个个字节.

如果把example2结构体改为(元素2、3颠倒了):

struct example2
{
   char c;
   short e;
   example1 struct1;
};

程序输出结果则变为:8 12 4 (去掉上面的char或short ,结果仍是8 12 4)

有点茫然,这到底是怎么一回事?上述两个对比,好像是用到了内存分配时的补齐原则(char和short总共占四个字节)。但在对齐的时候是结构体成员变量example1的组成元素来进行对齐的,而是按照里面最大的进行对齐的(即4)。

举例验证:

1、示例一:结构体成员变量占字节数大于所有其他成员变量(取结构体内部元素所占字节的最大数进行对齐)

struct example1
{
 short a;                            //2字节     (对齐为8)
 double b;                         //8字节
};
struct example2
{
 long c;                             //4字节    (对齐为8)
 example1 struct1;           //16字节(按其内部8来对齐)
 short e;                          //2字节     (对齐为8)
};

输出结果:16 32 8

1、示例二:结构体成员变量占字节数小于其他某成员变量

struct example1
{
 short a;
 char b;
};
struct example2
{
 double c;                     //8字节(按此进行对齐)
 example1 struct1;       //4字节
 short e;                      //2字节(补齐原则,这两个总共占8字节)
};

输出结果:4 16 8

修改example2为:

struct example2

 short e;                      //2字节  (对齐8字节)
 double c;                     //8字节(按此进行对齐)
 example1 struct1;       //4字节  (对齐8字节)
 };

输出结果: 4  24 16

 

今天主要是对存在结构体成员变量时,内存分配的对齐与补齐原则进行了一个大致的试验总结。

刚准备结束发现上面还有一个东东没注意到,#pragma pack(8)这是什么玩意?改一下,看看有没有什么变化。8改为4,运行一下刚才的最后一个例子,输出结果竟然变成了:4 16 12。看来这个东东是和内存分配有关系,google一下吧。

伪指令#pragma pack (n),C编译器将按照n个字节对齐。
伪指令#pragma pack (),取消自定义字节对齐方式。

现在应该明白最后一个小测试结果怎么变了吧。当明确指定了对齐字节数,则会选择默认对齐和指定值中小的进行对齐。上面结构体体example2默认对齐是8,应选择指定对齐4,故short补为4.

 

附:int(4字节)、short(2字节)、long(4字节)long long(8字节)

      float(4字节)、double(8字节)

     char(1字节)

  评论这张
 
阅读(560)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018