ps:结构体内存地址三大原则
- 原则1:结构体首地址(start)是结构体中最大基本数据类型成员所占空间的整数倍
- 原则2:结构体中的成员偏移量(offset)是该成员所占字节的整数倍
- 原则3:结构体的总大小(end-start)是结构体中最大基本数据类型成员所占空间的整数倍
在C语言中,结构体(struct
)的内存对齐是为了优化访问速度和满足特定硬件平台的要求。编译器会自动对结构体成员进行对齐,这可能导致某些空间未被使用,从而增加结构体的总大小。
但是在某些内存比较紧张的应用场景下,我们不得不珍惜每一个字节,这个时候就要优先考虑减少浪费,下面是几种方式以供参考
1、调整顺序
最简单的,规范成员的顺序,按照占用的字节数从小到大排列
//32位
struct test { //占用12字节
char a;
int b;
char c;
}
struct test { //占用8字节
char a;
char c;
int b;
}
2、packed属性
在编译阶段指定结构体按照自定义的字节数对齐(此属性并非所有平台都支持)
#pragma pack(1) //指定对齐字节为1
struct my_struct {
char a; //1
int b; //4
double c; //8
};
#pragma pack() //回复默认对齐方式
3、使用位域(BitFielde)
对于位操作,可以使用位域指定每个成员占用的位数,从而精确控制内存使用
struct my_struct {
unsigned char a : 1; // 1 bits for 'a'
unsigned int b : 4; // 4 bits for 'b'
};
除此之外还有内存池、压缩技术,这些就是大佬使用的技术了,上面说的大多数场景都足够了
ps:这些办法会影响性能,非内存不足者不能用