0%

使用__attribute__配置结构体,禁用编译器自动对齐

概述

结构体声明中加上__attribute__((packed)),可以防止编译器对结构进行字节对齐优化。
使用__attribute__((aligned(8)))(8为对齐字节数),可以强制编译器按指定字节对齐。

结构体定义

使用 packed

1
2
3
4
5
6
struct AlignTest
{
char a; //1
short b; //2
int c; //4
} __attribute__((packed));

使用sizeof获取结构体的大小,返回7

不使用 packed

1
2
3
4
5
6
struct AlignTest
{
char a; //1
short b; //2
int c; //4
};

根据结构体中最长的类型(int),进行对齐,获取到的结构体大小为8

指定对齐大小

1
2
3
4
5
6
7
struct AlignTest
{
char a; //1
short b; //2
int c; //4
int d; //4
} __attribute__((aligned(8)));

不使用指定对齐字节时,结构体大小为3*4=12,指定后变为16

参考

为什么要用 “ attribute ((packed)) ” 定义结构体
attribute 用法