目录
上周,软件组做一个培训,培训内容如下。内存也是我们使用过程中容易忽略的一个细节,特别是通过指针地址的方式访问结构体里面的成员时,会遇到获取的值和自己需要的值不一致的原因。这个问题也是我的同事遇到的。(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位 |
---|---|---|
bool | 1 | 1 |
unsigned char | 1 | 1 |
char | 1 | 1 |
short int | 2 | 2 |
unsigned int | 4 | 4 |
int | 4 | 4 |
float | 4 | 4 |
double | 8 | 8 |
unsigned long | 4 | 8 |
long | 4 | 8 |
long long | 8 | 8 |
指针 | 4 | 8 |
总结:
数据的内存在实际的运用中是需要注意的,特别是使用指针指向地址的方式访问。联合体在我们网络中,进行报文分析的使用比较频繁,因此对于联合体还是更需要注意的。
参考资料:
https://cloud.tencent.com/developer/article/1808569