字节对齐__align(),__attribute((aligned (n))),#pragma pack(n)这三个什么区别呀??

2019-10-15 02:17发布

最近想了接一些字节对齐的知识。
1,查了字节对齐的原因--为什么要字节对齐??大多数是说,为了CPU执行效率,这个太宏观了。听起来很泛泛的感觉,如果不是为了CPU的一些效率或者速度的话,执行这些东西干嘛,所以查了很久还是不了解为什么要字节对齐。
2,__align(),__attribute((aligned (n))),#pragma pack(n)看到很多讲解着三个关键字来说字节对齐的,不知道这三者什么区别呢??
3,还有就是哪些关键地方要用到字节对齐呀???好多局部变量,全局变量都没有用。
4,这些对齐是不是和编译器及硬件有关系呀??

好像一口气问了好多问题也,不过我感觉很多人应该和我有同样的疑问吧。有没有好的文档可以了解一下呀??度娘搜的大多数都是讲---结构体用到字节对齐后的大小。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
22条回答
qq942266575
1楼-- · 2019-10-16 01:55
 精彩回答 2  元偷偷看……
aleda303
2楼-- · 2019-10-16 02:26
字节对齐 能够提高效率的原因是 :

8/16位 一般是 以 2的倍数
32位单片机(stm32) 是以4的倍数的 地址 来访问 内存的,如 0x***04 ~ 0x***08
所以 在访问 非4倍数的变量的时候比如 0x***6, 就先找到0x***04, 再加个偏移,这样就增加了指令时间
如果 大量充斥这种变量地址,则访问速度会大大降低
最快速的访问形式是 全部按4字节对齐

那为什么不全用4字节对齐呢?  这样会带了一个也很严重的问题,空间利用率。
比如我定义 char [100]  ,按四字节对齐是能够增加运行速度, 但是 空间要浪费4倍。

所以 在综合 考虑 时间/空间 的基础上, 系统默认 一个折中方式就是 对齐

、、这三种方式什么区别我也不知道。

可能....似乎啊,区别是: 作用区域不一样、【不确定】
    在#pragma pack(n) ......#pragma pack()两句之间有效
    __attribute((aligned (n))) 可能在当前文件有效,

 我一般都用 #pragma pack(n)
xouou_53320
3楼-- · 2019-10-16 05:18
mark.....
mark0668
4楼-- · 2019-10-16 09:14
mark,字节对齐关键字,好问题
龙之谷
5楼-- · 2019-10-16 10:40
回复【3楼】正点原子:
---------------------------------
我也不知道啥区别,也许不同编译器不同处理吧
合肥-文盲
6楼-- · 2019-10-16 14:14
 精彩回答 2  元偷偷看……

一周热门 更多>