1. 什么是__attribute__?
第一次看到代码里出现__attribute__((aligned(8)))这样的写法时,我也是一头雾水。这其实是GNU C提供的一个强大工具,简单来说就是给编译器"打小报告"的机制。比如你告诉编译器:"这个结构体请按8字节对齐",或者"这个函数永远不会返回"。
在实际项目中,我经常用它来解决两类问题:一是内存布局优化,比如网络协议栈开发中需要精确控制结构体大小;二是性能调优,比如确保关键数据按照CPU缓存行对齐。举个例子,有一次我们做视频解码器优化,通过__attribute__((aligned(64)))让关键数组对齐到缓存行,性能直接提升了15%。
2. 内存对齐的实战技巧
2.1 aligned属性的妙用
内存对齐不是玄学,而是硬件的要求。CPU读取内存时,如果数据地址是4的倍数(32位系统)或8的倍数(64位系统),一次总线事务就能搞定,否则可能要拆成多次操作。看这个例子:
struct bad_example {
char c; // 1字节
int i; // 4字节
}; // 实际占用可能是8字节,中间有3字节填充
用aligned可以手动优化:
struct optimized {
char c __attribute__((aligned(4)));
int i;
}; // 现在编译器会确保c从4字节边界开始
我在嵌入式项目里验证过,对齐后的结构体访问速度能快20%。但要注意,过度对齐会浪费内存,比如在RAM紧张的STM32项目里,把1字节的bool强制对齐到8字节就太奢侈了。
2.2 packed属性的取舍
当我们需要与硬件寄存器或网络协议严格匹配时,packed就派上用场了:


278

被折叠的 条评论
为什么被折叠?



