结构体的大小

    传说中一篇凑数的博客,无意中发现自己在08年3月写的一个东西,感觉挺有意思。就拿来凑凑数吧。不多说了,言归正传。 

 
  
struct stru_type
{
    
int a;
    
double d;
    
char * pch;
    stru_type
* stru;
};
sizeof (stru_type) =?

    看到题目后思路是这样:

 
  
sizeof (stru_type) =
sizeof (a) + sizeof (d) + sizeof (pch) + sizeof (stru) = 4 + 8 + 4 + 4 = 20

 

    运行发现这个怎么都不正确,答案是24
    找了些文档看了看,发现有一个内存的对齐的问题。基本思路如下:
               结构体中任何一个元素的起始位置必须是该元素的字节数大小的倍数
    回到原来的题目:

       int a占四个字节起始位置为0符合sizeof(int)的倍数,
       double d八个字节,但是起始位置为4,不符合sizeof(double)的倍数,则在int  a之后4个字节开始排列。
       同理,char*pch和stru_type*stru可以依次排列
                    最后要保证结构体的总大小是其中最大元素的倍数。
       则题目结果为4+4+8+4+4=24。
   扩展一下,C++的位域问题,  

 
  
  struct s
  {
    
int i: 8 ;
    
int j: 8 ;
    
int a: 9 ;
    
int b: 8 ;
  };
  cout
< < sizeof (s) < < endl;

    这个程序的输出结果是8。首先看int i:8;这句的意思一个整形变量,占8bit。同理知道其他元素所占的位数,如果没有内存对齐的问题这个程序的结果应该是5,采用内存对齐的方式,8+9+8+8>32超过了4个字节,则新分配sizeof(int)个字节。结果为8。

    以上结果均在win32平台下运行过。IDE是vs2005

转载于:https://www.cnblogs.com/liliu/archive/2010/11/20/1882343.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值