"); //-->
#pragma pack(n)和__attribute__((aligned(m)))的区别:
前者告诉编译器结构体或类内部的成员变量相对于第一个变量的地址的偏移量的对齐方式,缺省情况下,编译器按照自然边界对齐,当变量所需的自然对齐边界比n大时,按照n对齐,否则按照自然边界对齐;后者告诉编译器一个结构体或者类或者联合或者一个类型的变量(对象)分配地址空间时的地址对齐方式。也就是所,如果将__attribute__((aligned(m)))作用于一个类型,那么该类型的变量在分配地址空间时,其存放的地址一定按照m字节对齐(m必须是2的幂次方)。并且其占用的空间,即大小,也是m的整数倍,以保证在申请连续存储空间的时候,每一个元素的地址也是按照m字节对齐。__attribute__((aligned(m)))也可以作用于一个单独的变量。举例说明:
#include<stdio.h>
#pragma pack(4)
typedef struct{
uint32_t f1;
uint8_t f2;
uint8_t f3;
uint32_t f4;
uint64_t f5;
}__attribute__((aligned(1024))) ts;
int main()
{
printf("Struct size is: %d, aligned on 1024\n",sizeof(ts));
printf("Allocate f1 on address: 0x%x\n",&(((ts*)0)->f1));
printf("Allocate f2 on address: 0x%x\n",&(((ts*)0)->f2));
printf("Allocate f3 on address: 0x%x\n",&(((ts*)0)->f3));
printf("Allocate f4 on address: 0x%x\n",&(((ts*)0)->f4));
printf("Allocate f5 on address: 0x%x\n",&(((ts*)0)->f5));
return 0;
}
输出:
Struct size is: 1024, aligned on 1024
Allocate f1 on address: 0x0
Allocate f2 on address: 0x4
Allocate f3 on address: 0x5
Allocate f4 on address: 0x8
Allocate f5 on address: 0xc
注意
绿色部分表明了__attribute__((aligned(1024))) 的作用
红色部分说明#pragma pack(4)只对大小大于4的成员变量的地址偏移起作用
紫色部分说明对于大小大于4的成员变量,其地址偏移按照4字节对齐
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
中国将是AGI时代的强国
《Linux进程间通信》PDF课件下载
中国汽车制造商赛力斯集团预计2024年营收同比大幅增长309%
如何善用通用性行业KG(知识图)
《FPGA技术与数字系统设计基础》视频下载
[求助]关于Vxworks目标文件下载(老站转)
德州仪器:坚持用产品创新推动行业发展
SH7264汽车数字仪表板解決方案
逐点半导体:用创新迎接机遇
八声连续太空枪电路(CD4069、KD9562)
由CD4049组成的多音调蜂鸣器电路
由CD4011、CD4066组成的十六声音响发声电路
2024年长安汽车在中东地区的销量同比增长51%
AE1-L车载音响解决方案
[推荐]嵌入式技术手册
SH7764车载导航系统解決方案
R8C触摸式遥控器解决方案
《DSP硬件开发培训》讲课视频下载
《DSP硬件开发培训》PDF课件下载
H8S2、28x汽车仪表板解決方案
Java与嵌入式系统[gulf转]
瑞萨电子:严峻考验后期待新机遇
《FPGA技术与数字系统设计基础》PDF课件下载
由CD4009、CD4011组成的洒水车音响效果模拟电路
嵌入式设计仍然令人恼火吗?(gulf转)
BUG: 搜索不到精华区的帖子
2025存储前瞻:用存储加速AI,高性能SSD普适化
机器人/人形机器人“十五五”产业发展预测
村田制作所:AI技术驱动下的2024年电子行业的创新与2025年展望
由CD4017构成的电子八音盒电路