字节对齐__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条回答
roarghy
2019-10-16 18:58

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]
			
		
	
	
		
Related reference
7.104 --min_array_alignment=opt 9.60 __attribute__((aligned)) variable attribute

一周热门 更多>