__align 和__packed对齐修辞符使用说明

来源:互联网 发布:adele 知乎 编辑:程序博客网 时间:2024/05/09 21:37
简单介绍一下对齐的使用:   
    
  1.__align(num)   
        这个用于修改最高级别对象的字节边界。__align 关键字指示编译器在 num 字节边界上对齐变量。在汇编中使用LDRD或者STRD时就要用到此命令__align(8)进行修饰限制。来保证数据对象是相应对齐。 这个修饰对象的命令最大是8个字节限制,可以让2字节的对象进行4字节 对齐,但是不能让4字节的对象2字节对齐。   
        __align 是一个存储类修饰符。它不影响函数的类型。


对于局部变量,num  值可为 1、2、4 或 8。


对于全局变量,num 可以具有最大为 2 的 0x80000000 次幂的任何值。


__align 关键字紧靠变量名称前面放置。


用法
如果声明的变量的常规对齐边界小于 num ,__align(num ) 是非常有用的。八字节对齐方式可以显著提高 VFP 指令的性能。


可以将 __align 与 extern 和 static 一起使用。


限制
由于 __align是存储类修改,他只修饰最高级类型对象不能用于:


类型,包括 typedef 、结构定义及函数参数。


只能进行过对齐。也就是说,可以将两个字节的对象按 4 个字节对齐,而不能将 4 个字节的对象按两个字节对齐。


示例
__align(8) char buffer[128]; 


void foo(void){
      __align(16) int i; 




}


__align(16) int i; // permitted as a global variable.      


    
  2.__packed     
      __packed是进行一字节对齐   
      1.不能对packed的对象进行对齐   
      2.所有对象的读写访问都进行非对齐访问   
      3.float及包含float的结构联合及未用__packed的对象将不能字节对齐   
      4.__packed对局部整形变量无影响   
      5.强制由unpacked对象向packed对象转化是未定义,整形指针可以合法定   
      义为packed。
原创粉丝点击