上篇文章:ARM 嵌入式 编译系列 10.3 – GNU elfutils 工具小结
下篇文章:ARM 嵌入式 编译系列 11.1 – GCC attribute((aligned(x)))详细介绍
attribute((packed)) 介绍
__attribute__((packed))
是 GCC 编译器的一个特性,它可以用于阻止编译器为结构体或联合体的成员进行对齐优化,从而使其尽可能地小。
默认情况下,编译器可能会在结构体的成员之间添加填充字节,以确保特定类型的数据在内存中按照适当的边界对齐,以提高处理器访问数据的效率。但是,这可能会导致结构体比实际需要的更大。
使用 __attribute__((packed))
可以消除这些填充字节,使得结构体或联合体的大小尽可能小。
以下是一个简单的示例:
#include <stdio.h>
struct normal_struct
{
char c;
int i;
};
struct __attribute__((packed)) packed_struct {
char c;
int i;
};
int main(void)
{
printf("Size of normal_struct: %lu\n", sizeof(struct normal_struct));
printf("Size of packed_struct: %lu\n", sizeof(struct packed_struct));
return 0;
}
在这个示例中,normal_struct
是一个常规的结构体,由于编译器对 int
类型的对齐要求,它的大小可能大于 packed_struct
。packed_struct
使用了 __attribute__((packed))
,所以它的大小是成员 char c
和 int i
的大小的总和,没有额外的填充字节。
[09:34:09]sam@sam-pcStation-P350 (*^~^*) ~/workbase/test> gcc test.c
[09:34:13]sam@sam-pcStation-P350 (*^~^*) ~/workbase/test> ./a.out
Size of normal_struct: 8
Size of packed_struct: 5
但是请注意,使用 __attribute__((packed))
可能会导致处理器需要执行额外的操作来加载或存储非对齐的字段,这可能会降低代码的性能。因此,在考虑使用此属性时,应权衡内存使用和代码性能之间的平衡。
上篇文章:ARM 嵌入式 编译系列 10.3 – GNU elfutils 工具小结
下篇文章:ARM 嵌入式 编译系列 11.1 – GCC attribute((aligned(x)))详细介绍