码迷,mamicode.com
首页 > 其他好文 > 详细

结构体在内存中所占字节大小计算

时间:2014-07-22 23:00:14      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   strong   数据   

作者 :卿笃军


今天上课,老师给我们演示了一下,计算结构体在内存中所占的字节大小。开始给了我们几个例子,然后要我们自己摸索出规律。

注:以下测试全是在win7_64bit  Devcpp 5.5.3环境下测试的。(char 1字节,int 4字节, double 8字节)。

也许:你可能认为下面这个答案是 1+4 = 5   (×

#include <stdio.h>

struct node
{
	char a;
	int b;
};

int main()
{
	struct node QING;
	
	printf("%d\n",sizeof(QING));
	 
	return 0;
} 

其实,这个题目的答案是: 8 (

这牵涉到一个 结构体字节对齐问题 ,具体结构体为什么要字节对齐,又是如何对齐的,可以参考下面的两篇文章(我网上搜的):

1.海阔凭鱼跃,天高任鸟飞的博客专栏,结构体在内存中所占空间大小的计算,http://blog.csdn.net/onlyanyz/article/details/8159240

2.Eliot的博客专栏结构体字节对齐http://blog.csdn.net/xyw_blog/article/details/20445953


       在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。


      内存对齐的原因:
      1)某些平台只能在特定的地址处访问特定类型的数据;
      2)提高存取数据的速度。比如有的平台每次都是从偶地址处读取数据,对于一个int型的变量,若从偶地址单元处存放,则只需一个读取周期即可读取该变量;但是若从奇地址单元处存放,则需要2个读取周期读取该变量。


我们以例子来说明对齐方式吧:

例一、char , int 对齐;

#include <stdio.h>

struct node
{
	char a;
	int b;
};

int main()
{
	struct node QING;
	
	printf("%d\n",sizeof(QING));
	 
	return 0;
} 

输出结果: 8

解释:结构体中(注意变量定义的顺序),char 是1个字节,int 是4 个字节,结构体字节对齐:char 和 int对齐。所以将char补齐到4个字节。

所以最后结构体所占字节: 4 + 4 = 8;


例二、char *, int 对齐;

#include <stdio.h>

struct node
{
	char a[5];
	int b;
};

int main()
{
	struct node QING;
	
	printf("%d\n",sizeof(QING));
	 
	return 0;
} 

输出结果: 12

解释:结构体中char a[4],已经和下面的int 对齐了,可是还剩下一个char a[1]这个也需要补齐到int (4)。

所以最后结果: 8 + 4 = 12


例三、char , int , double 对齐;

#include <stdio.h>

struct node
{
	char a;
	int b;
	double c;
};

int main()
{
	struct node QING;
	
	printf("%d\n",sizeof(QING));
	 
	return 0;
} 

输出结果: 16

解释:结构体中char , int 两个字节数(整体),与下面的double对齐。所以char ,int 整体字节数要凑够8 。

所以最后结果: 8 + 8 = 16


例四、char ,double, int对齐;

#include <stdio.h>

struct node
{
	char a;
	double c;
	int b;
};

int main()
{
	struct node QING;
	
	printf("%d\n",sizeof(QING));
	 
	return 0;
} 

输出结果: 24

解释:比较例三,我们发现只是结构体里面的定义顺序改变了,却造成了结果的不同。那么这是为什么呢?

其实是这样的,上面的char 要和double对齐,所以char 字节要补齐到double(8),然后double不可能和下面的int对齐吧?因为double本来就比int大,所以不可能对齐,那么就只有int和double对齐了哦,所以int也要补齐到double(8)。

所以最后结果: 8 + 8 + 8 = 24


结构体在内存中所占字节大小计算,码迷,mamicode.com

结构体在内存中所占字节大小计算

标签:style   blog   http   color   strong   数据   

原文地址:http://blog.csdn.net/qingdujun/article/details/24844681

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!