OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 32641|回复: 25

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

[复制链接]

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
发表于 2012-12-24 21:39:30 | 显示全部楼层 |阅读模式

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

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

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2012-12-25 01:23:36 | 显示全部楼层
这个问题问的好.
,__align(),__attribute ,#pragma pack
这三个我都用过,但是也不太清楚具体的区别,期待高人讲解下.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
发表于 2015-9-29 16:27:54 | 显示全部楼层

__attribute__((aligned)) variable attribute

9.60 __attribute__((aligned)) variable attribute

Thealignedvariable attribute specifies a minimum alignment for the variable or structure field, measured in bytes.

Note

This variable attribute is a GNU compiler extension that the ARM compiler supports.

Examples

/* Aligns on 16-byte boundary */
int x __attribute__((aligned (16)));
/* In this case, the alignment used is the maximum alignment for a scalar data type. For ARM, this is 8 bytes. */
short my_array[3] __attribute__((aligned));
[/mw_shl_code]
			
Related reference
Non-Confidential   ARM DUI0375E
Copyright © 2007, 2008, 2011, 2012, 2014 ARM. All rights reserved.  
回复 支持 1 反对 0

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
发表于 2015-9-29 16:27:27 | 显示全部楼层

9.2 __align

The__alignkeyword instructs the compiler to align a variable on ann-byte boundary.

__alignis a storage class modifier. It does not affect the type of the function.

Syntax

__align(n)
Where:
n
is the alignment boundary.
For local variables,ncan take the values 1, 2, 4, or 8.
For global variables,ncan take any value up to 0x80000000 in powers of 2.

Usage

__align(n)is useful when the normal alignment of the variable being declared is less thann. Eight-byte alignment can give a significant performance advantage with VFP instructions.
__aligncan be used in conjunction withexternandstatic.

Restrictions

Because__alignis a storage class modifier, it cannot be used on:
  • Types, includingtypedefs and structure definitions.
  • Function parameters.
You can only overalign. That is, you can make a two-byte object four-byte aligned but you cannot align a four-byte object at 2 bytes.

Examples

__align(8) char buffer[128];  // buffer starts on eight-byte boundary
[/mw_shl_code]
void foo(void)
{
    ...
    __align(16) int i; // this alignment value is not permitted for
                       // a local variable
    ...
}
__align(16) int i; // permitted as a global variable.
[/mw_shl_code]
			
回复 支持 1 反对 0

使用道具 举报

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2013-9-30
在线时间
0 小时
发表于 2013-10-31 21:04:43 | 显示全部楼层
http://blog.csdn.net/21aspnet/article/details/6729724
具体的在这,讲的很好
好好学习,天天向上
回复 支持 1 反对 0

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2012-12-24 21:50:01 | 显示全部楼层
1、硬件限制;2、不同编译器的不同实现方法;3、编译器默认处理;4一般char按字节对齐,short按2字节对齐,long按4字节对齐。char如果要4字节对齐就要特别声明。
业余程序玩家。
回复 支持 反对

使用道具 举报

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
 楼主| 发表于 2012-12-25 21:33:56 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
呵呵....最近做项目的时候遇到了,以前学C语言和学习开发板的时候没有注意,现在感觉这些知识很重要。
回复 支持 反对

使用道具 举报

51

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
561
金钱
561
注册时间
2011-4-11
在线时间
43 小时
 楼主| 发表于 2012-12-25 21:35:15 | 显示全部楼层
回复【2楼】ofourme:
---------------------------------
O(∩_∩)O哈哈~  谢谢,昨天看了一下,虽然云里雾里的,但是你说的还是蛮有意思的,回答的真是简洁明了。
回复 支持 反对

使用道具 举报

47

主题

255

帖子

1

精华

高级会员

Rank: 4

积分
641
金钱
641
注册时间
2012-11-3
在线时间
6 小时
发表于 2013-6-17 12:24:37 | 显示全部楼层
回复【2楼】ofourme:
---------------------------------
怎样设置MDK几字节对齐?
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
发表于 2013-6-17 12:57:26 | 显示全部楼层
学习了。
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-6-17 16:22:56 | 显示全部楼层
字节对齐 能够提高效率的原因是 :

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)
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-6-17 20:49:38 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-1-16
在线时间
4 小时
发表于 2015-4-20 23:47:12 | 显示全部楼层
mark.....
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-4-21 08:35:38 | 显示全部楼层
mark,字节对齐关键字,好问题
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-8-24 16:06:32 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
我也不知道啥区别,也许不同编译器不同处理吧
合肥-文盲
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
发表于 2015-9-29 16:26:36 | 显示全部楼层
虽然帖子很久了,但是我还是说下。
MDK环境下,详见MDK--HELP--uversionhelp----compiler specific Features----9.2__align、9.6__attribute__((aligned))、9.91#pragma pack(n),解释的很清晰。我依次贴出来。
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-9-7
在线时间
8 小时
发表于 2015-9-29 16:29:51 | 显示全部楼层

#pragma pack(n)

9.91 #pragma pack(n)

This pragma aligns members of a structure to the minimum ofnand their natural alignment. Packed objects are read and written using unaligned accesses.

Note

This pragma is a GNU compiler extension that the ARM compiler supports.

Syntax

#pragma pack(n)
Where:
n
is the alignment in bytes, valid alignment values being1,2,4and8.

Default

The default is#pragma pack(8).

Errors

Taking the address of a field in a#pragma packedstructdoes not yield a__packedpointer, so the compiler does not produce an error if you assign this address to a non-__packedpointer. However, the field might not be properly aligned for its type, and dereferencing such an unaligned pointer results in undefined behavior.

Examples

This example demonstrates howpack(2)aligns integer variablebto a 2-byte boundary.
typedef struct
{ 
    char a;
    int b;
} S;
#pragma pack(2)
typedef struct
{ 
    char a;
    int b;
} SP;
S var = { 0x11, 0x44444444 };
SP pvar = { 0x11, 0x44444444 };
[/mw_shl_code]
				
The layout ofSis:
Figure 9-1 Nonpacked structure S

The layout ofSPis:
Figure 9-2 Packed structure SP

Note

In this layout,xdenotes one byte of padding.
SPis a 6-byte structure. There is no padding afterb.
1111.png
回复 支持 反对

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2015-11-2 22:57:21 | 显示全部楼层
回复【17楼】roarghy:
---------------------------------
受教了,感谢提供资料,而且得到一种新的思路,编译器的help文件真的很少去看。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复 支持 反对

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 2015-11-15 13:22:31 | 显示全部楼层
mark,感谢分享!
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2011-7-11
在线时间
49 小时
发表于 2016-1-10 12:20:29 | 显示全部楼层
MARK了
回复 支持 反对

使用道具 举报

36

主题

195

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2014-10-27
在线时间
34 小时
发表于 2016-1-18 15:33:32 | 显示全部楼层
mark,好东西!
回复 支持 反对

使用道具 举报

35

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2014-7-30
在线时间
49 小时
发表于 2016-11-9 13:25:50 | 显示全部楼层
aleda303 发表于 2013-6-17 16:22
字节对齐 能够提高效率的原因是 :

8/16位 一般是 以 2的倍数
32位单片机(stm32 ...

为什么我看MDK里对于32的编译器有这么一句话
The default is #pragma pack(8),即为什么是默认8字节对齐呐?
我就是我,是颜色不一样的烟火。
回复 支持 反对

使用道具 举报

10

主题

147

帖子

0

精华

高级会员

Rank: 4

积分
602
金钱
602
注册时间
2015-7-11
在线时间
94 小时
发表于 2017-2-16 20:03:49 | 显示全部楼层
学习了,谢谢!!
回复 支持 反对

使用道具 举报

8

主题

145

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2016-12-14
在线时间
75 小时
发表于 2017-2-17 09:29:17 | 显示全部楼层
学习了,mark
书山有路勤为径,学海无涯苦作舟!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2016-10-7
在线时间
11 小时
发表于 2020-7-25 11:42:59 | 显示全部楼层
roarghy 发表于 2015-9-29 16:26
虽然帖子很久了,但是我还是说下。
MDK环境下,详见MDK--HELP--uversionhelp----compiler specific&nb ...

漂亮,这才是我们想要的权威解答
回复 支持 反对

使用道具 举报

33

主题

218

帖子

0

精华

高级会员

Rank: 4

积分
568
金钱
568
注册时间
2015-1-12
在线时间
75 小时
发表于 2020-12-21 15:48:07 | 显示全部楼层
感谢    找了好久。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-14 21:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表