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

作者 :卿笃军

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

注:以下测试全是在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

时间: 2024-11-10 01:28:03

结构体在内存中所占字节大小计算的相关文章

C语言结构体在内存中的存储情况探究------内存对齐

条件(先看一下各个基本类型都占几个字节): void size_(){ printf("char类型:%d\n", sizeof(char)); printf("int类型:%d\n", sizeof(int)); printf("float类型:%d\n", sizeof(float)); printf("double类型:%d\n", sizeof(double)); return; } 结果: 先来一下, 这个结构体在内

结构体在内存中的存储方式

结构体在内存中如何存储? 遵循结构体对齐规则: 1.首先要知道默认对齐数:VS 中 8   Linux 中4 2.第一个成员放到0偏移处 3.后面所有的成员都放到对齐数(本身和默认对齐数的较小值)的倍数处偏移 4.结构体总大小为所有对齐数中最大对齐数的倍数 Eg: 运行结果为 24 图中可以看出内存有浪费,而我们将小的成员放一起可以节省资源 减少浪费. 上例可以改为: int i: char c: double d: 这样总大小只需16 节省浪费. 空的结构体类型大小为1,创建对象需要开辟空间,

C++主要数据类型在计算机中所占字节大小

遇到了数据存储的大端和小端问题,这你妹的看的一头雾水,发现我基本知识严重匮乏啊,先了解C++各数据类型在自己机子上占多少字节吧,以及这些数据类型所占字节大小与神马有关.各种查资料然后写代码检验,小结于本文中,给自己补补基础知识. 先来列一下C++的数据类型: 整型:int,long.这两个还分signed(有符号)和unsigned(无符号)的,当然有符号和无符号所占字节大小是一样的,就不管他了. 布尔型:bool 字符型:char,wchar_t 浮点型:float,double 这只能上代码

(转)结构体在内存中的对其规则

参考的网址:http://blog.csdn.net/grantxx/article/details/7577730 一个结构体变量定义完之后,其在内存中的存储并不等于其所包含元素的宽度之和. 例一: #include <iostream> using namespace std; struct X { char a; int b; double c; }S1; void main() { cout << sizeof(S1) << endl; cout <<

结构体在内存中的对其规则

一个结构体变量定义完之后,其在内存中的存储并不等于其所包含元素的宽度之和. 例一: #include <iostream> using namespace std; struct X { char a; int b; double c; }S1; void main() { cout << sizeof(S1) << endl; cout << sizeof(S1.a) << endl; cout << sizeof(S1.b) &l

sizeof运算符来获取各种数据类型在内存中所占字节数--gyy整理

C++并没有规定各种数据类型在内存中的存储大小,依赖于不同的编译器的不同而不同,要想获知当前编译器对各种数据类型分配的大小,可以通过sizeof运算符来获取. 使用方法1: sizeof(数据类型)   使用方法2: sizeof(变量名   或 常量名 或 表达式  ) sizeof(int)      或 int  a: sizeof(a) [cpp] view plain copy //数据类型空间分配情况 #include <iostream> using namespace std;

结构体所占字节大小计算以及共用体大小计算

#include<stdio.h> struct student{ int num; char sex; float score; } ; union data{ int k; char ch; float f; }; int main(void){ printf("%d\n",sizeof(struct student)); printf("%d",sizeof(union data)); } 详细计算见:https://blog.csdn.net/u

逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式

一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合 2.在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类. 3. 结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据结构.结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问. 高级代

C语言 结构体的内存对齐问题与位域

http://blog.csdn.net/xing_hao/article/details/6678048 一.内存对齐 许多计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对 齐,而这个k则被称为该数据类型的对齐模数(alignment modulus).当一种类型S的对齐模数与另一种类型T的对齐模数的比值是大于1的整数,我们就称类型S的对齐要求比T强(严格),而称T比S弱(宽 松).这种强制的要求一来简化了处