【ARM 嵌入式 编译系列 11 -- GCC __attribute__((packed))详细介绍】

文章目录

    • __attribute__((packed)) 介绍

上篇文章:ARM 嵌入式 编译系列 10.3 – GNU elfutils 工具小结
下篇文章:ARM 嵌入式 编译系列 11.1 – GCC attribute((aligned(x)))详细介绍

attribute((packed)) 介绍

__attribute__((packed)) 是 GCC 编译器的一个特性,它可以用于阻止编译器为结构体或联合体的成员进行对齐优化,从而使其尽可能地小。

默认情况下,编译器可能会在结构体的成员之间添加填充字节,以确保特定类型的数据在内存中按照适当的边界对齐,以提高处理器访问数据的效率。但是,这可能会导致结构体比实际需要的更大。

使用 __attribute__((packed)) 可以消除这些填充字节,使得结构体或联合体的大小尽可能小。

以下是一个简单的示例:

#include 

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_structpacked_struct 使用了 __attribute__((packed)),所以它的大小是成员 char cint 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)))详细介绍

你可能感兴趣的:(#,ARM,GCC,编译系列介绍,arm开发,gcc,packed,attribute,gcc,对齐,阻止编译器为结构体成员进行对齐)