面试题答案
一键面试- 优化后的结构体定义:
struct Data {
int id;
short code;
char flag;
double value;
} __attribute__((packed));
- 原理解释:
- 成员顺序调整:
- 在常见平台(如x86和ARM)上,数据类型的对齐要求通常与数据类型的大小有关。一般来说,较小的数据类型尽量放在一起,较大的数据类型放在后面,这样可以减少因为对齐要求而产生的填充字节。
int
通常为4字节,short
为2字节,char
为1字节,double
为8字节。按照原结构体定义,int
之后是char
,char
占用1字节,为了满足double
的8字节对齐要求,在char
和double
之间会填充3字节。而优化后,int
之后接着short
,short
占用2字节,char
占用1字节,int
、short
和char
加起来共7字节,为满足double
的8字节对齐要求,只需要填充1字节。所以通过调整成员顺序,减少了填充字节数。
__attribute__((packed))
:- 这个属性告诉编译器取消结构体在编译过程中的字节对齐优化,按照实际的成员顺序和大小分配内存空间,进一步减少结构体占用的空间。但使用
__attribute__((packed))
可能会降低一些访问效率,因为未对齐的内存访问在某些平台上可能需要更多的指令周期。不过在追求最小空间占用的场景下,这种方式是可行的。这样优化后的结构体在常见平台上既能以最小空间占用,又能保持数据访问的正确性。
- 这个属性告诉编译器取消结构体在编译过程中的字节对齐优化,按照实际的成员顺序和大小分配内存空间,进一步减少结构体占用的空间。但使用
- 成员顺序调整: