__align和__packed区别

1. __align用于字节对齐偏向于存储 

假设 u32 date;(举例不合适正常情况下 ,编译器已经 对齐 但是如果,存在结构体的情况,date的值 就可能不对齐)

date 的地址 自动分配是 0x0000011 但是对一些平台不支持非对称访问的 就会直接进 硬件错误 

为了确保 分配地址 可以 是对齐访问 

 __align (4) u32 date; 分配地址自动 4字节对齐 date 地址 不在是0x11,而是 0x12.

 

__packed

可以理解成系统的占位符 自动的

struct A

{

u8 a;

u16 b;

u32 c;

}

不经过任何处理 站8字节

struct A

{

u8 a;

u32 c;

u16 b;

}

调换位置 后站12 字节 ->下面是官方介绍

但是如果加入限定 

__packed(1) 

上面两个结构体都是

对齐的使用:

     1) __align(num)

     用于修改最高级别对象的字节边界。在汇编中使用LDRD或STRD时就要用到此命令__align(8)进行修饰限制。来保证数据对象是相应对齐。

     这个修饰对象的命令最大是8个字节限制,可以让2字节的对象进行4字节对齐,但不能让4字节的对象2字节对齐。

     __align是存储类修改,只修饰最高级类型对象,不能用于结构或者函数对象。   

     2) __packed

     进行一字节对齐。需注意:

  • 不能对packed的对象进行对齐;
  • 所有对象的读写访问都进行非对齐访问;
  • float及包含float的结构联合及未用__packed的对象将不能字节对齐;
  • __packed对局部整型变量无影响。
  • 强制由unpacked对象向packed对象转化时未定义。整型指针可以合法定义为packed,如__packed int* p(__packed int 则没有意义)

站 7字节大小 

你可能感兴趣的:(__align和__packed区别)