struct结构体由于包含了不同的数据类型,而数据结构类型之间存在占用空间大小的问题,比如char型占用1字节,short int占用2字节,int、long int、指针、float占用4字节、double占用8字节(windows和linux中)。但计算机系统对基本数据类型可能允许地址做出了限制,要求某种类型的对象必须是2、4或8的倍数(为了简化处理器和存储系统之间的硬件设计——可以节省至少1根地址线)。
那么对于给出的一个struct类型数据,我们如何判断它占用多少空间呢?
很简单!我们按照对齐原则即可做出正确判断。但记住:即不是像某些教程说的用struct结构体中占用空间最大的那个变量的字节数乘以变量总数,也不是所有变量占用空间总和,然后补齐到占用最大空间变量所占用字节数的倍数。
那么,到底如何计算呢?
举个例子就明白了:
struct
{
int i;
char j;
int k;
char r;
int s;
}s;
sizeof s = ?
答案是20。
struct
{
int i;
char j;
char r;
int k;
int s;
}s;
sizeof s = ?
答案是16。
struct
{
double i;
char j;
char r;
int k;
int s;
}s;
sizeof s = ?
答案是20。
struct
{
double i;
char j;
int k;
char r;
int s;
}s;
sizeof s = ?
答案是24。
struct
{
double i;
char j;
short k;
char r;
short s;
}s;
sizeof s = ?
答案是16。
看出问题了吗?计算机系统按照struct中除了double外的变量类型中最大占用空间的字节数对齐。所以才有了上述结果。注意char在被int变量隔离开的时候,1个char也占用4字节,但两个char甚至4个char紧挨着存放时则均只占用4个字节(访问char变量按1的倍数访问,这样看来,CPU和存储器之间的地址线也不能减少,因为有可能访问到某地址,其最后一位也是1)。
分享到:
相关推荐
要求数据内存的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,本文就来深入剖析C++中的struct结构体字节对齐,需要的朋友可以参考下
前言:(10秒)前面的各位的方法很好,很传神,适合速成,想要速成还得看我这种小屁孩写的公式:(20秒)公式1:前面的地址必须是后面的地址正数倍,是就补齐公式2:
# 改变结构体成员的字节对齐 ## 例子 #include typedef struct { char a; int b; } ST_A;
关于结构变量定义引起内存对齐的问题 配有图示
data struct数据结构题集:第一章至第十一章
2,对于struct,对齐的大小也是最大的基本元素的对齐大小,对象的大小需要考虑元素的对齐,并且需要是最大基本元素的整数倍;同时有#pragma pack修饰的情况,关于struct请详细参考另外一个帖子。 3,这里所说的...
有了这些值,我们就可以很方便的来讨论具体数据结构的成员和其自身的对齐方式。有效对齐值N是最终用来决定数据存放地址方式的值,最重要。有效对齐N,就是表示“对齐在N上”,也就是说该数据的“偏移
C语言之struct大小、首地址与内存对齐[借鉴].pdf
Struct And Enums结构和枚举 、学习时练习使用的源码,在VS2005下练习使用
客户端与服务器交互,采用socket传输struct结构体。以及跟数据库的交互文件
matlab开发-struct2double。将结构转换为双格式。
struct typedef struct 区别
JStruct (JavaStructurizer) 允许创建,交互式编辑Java程序使用结构化的块(NSD: Nassi Shneiderman Diagrams)来实现算法。 该程序提供图形编辑与复制,移动,缩放,扩充性,每个块的的注释,javadoc结构或内联,导入和...
struct2第一个struct2,简单的struct2例子,struct2,struct2
typedef struct 与 struct 的区别及初始化 typedef struct 与 struct 的区别及初始化 typedef struct 与 struct 的区别及初始化 typedef struct 与 struct 的区别及初始化 typedef struct 与 struct 的区别及初始化
task_struct 数据结构1
赠送jar包:mapstruct-1.2.0.Final.jar; 赠送原API文档:mapstruct-1.2.0.Final-javadoc.jar; 赠送源代码:mapstruct-1.2.0.Final-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
结构体字节对齐规则,主要是介绍结构体字节对齐规则,内容有点长,但是很全面.