数据结构内存分配

目录

1、结构体的内存

2、联合体的内存

3、枚举的内存

4、不同系统下数据类型的字节大小


返回目录

        上周,软件组做一个培训,培训内容如下。内存也是我们使用过程中容易忽略的一个细节,特别是通过指针地址的方式访问结构体里面的成员时,会遇到获取的值和自己需要的值不一致的原因。这个问题也是我的同事遇到的。(32位系统中)

1、结构体的内存

规则1:结构体所占内存为结构体中成员最大整数倍

规则2:每个成员的起始地址为:该成员类型所占内存的整数倍(第一个成员起始位地址为0),如果不足部分用数据填充到所占内存的整数倍。

示例:

struct str1 {   // 
	char a;     //  1 byte 
    char b;     //  1 byte   
	int c;      //  4 byte
	float d;    //  4 byte
	double e;   //  8 byte(最大)
	char f;    //  1 byte
}s1;            // 32 byte

图解:1.1

优化后的结构体代码后:

struct str1 {   // 
	char a;     //  1 byte 
    char b;     //  1 byte 
    char f;    //   1 byte  
	int c;      //  4 byte
	float d;    //  4 byte
	double e;   //  8 byte(最大)
}s1;            // 24 byte

图解1.2 

2、联合体的内存

规则1.大小必须足够容纳最宽的成员

规则2.大小能够被它所包含的所有的基本数据类型的大小整除

union CanUnion1{
	char s[9];     //  9 byte (char类型为 1 byte)
	int n;         //  4 byte
	double d;      //  8 byte
};                 // 16 byte

union CanUnion2 {
	char s[5];     //  5 byte
	int n;         //  4 byte
	double d;      //  8 byte
};                 //  8 byte

图解2.1 

图解2.2 

3、枚举的内存

一般情况下,枚举是使用多少数据,就是占多少内存。在32位时,只有数据不超过32位,大小都是32位,如果超过就按照使用的倍数计算

64位计算机为8字节

枚举就不在具体展开说,小萌新求指教

4、不同系统下数据类型的字节大小

数据类型32位64位
bool11
unsigned char11
char11
short int22
unsigned int44
int44
float44
double88
unsigned long48
long48
long long88
指针48

总结:

数据的内存在实际的运用中是需要注意的,特别是使用指针指向地址的方式访问。联合体在我们网络中,进行报文分析的使用比较频繁,因此对于联合体还是更需要注意的。

参考资料:

https://cloud.tencent.com/developer/article/1808569

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值