MST

星途 面试题库

面试题:C语言结构体对齐优化及跨平台问题

在一个跨平台项目中,有如下结构体: ```c struct Data { int id; char flag; double value; short code; }; ``` 由于不同平台对齐规则可能不同,如何优化这个结构体的定义,使其在常见平台(如x86、ARM)上都能以最小空间占用且保持数据访问的正确性?同时解释优化背后的原理。
43.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

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