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

本文介绍了GCC编译器中的__attribute__((packed))特性,它用于消除结构体成员间的填充字节,减小内存占用,但可能影响代码性能。文章讨论了如何在内存使用和性能间权衡这一特性,并链接了上下文文章:GNUelfutils工具小结和aligned(x)详解。
摘要由CSDN通过智能技术生成


请阅读【ARM GCC 编译专栏导读】


上篇文章: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_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)))详细介绍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

主公讲 ARM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值