zoukankan      html  css  js  c++  java
  • ARM alignment全解释

    ARM硬件alignment的约束是:
    1. 一次访问4字节内容,该内容的起始地址必须是4字节对齐的位置上;
    2. 一次访问2字节内容,该内容的起始地址必须是2字节对齐的位置上;
    3. 单字节的没有这个问题,就不用考虑啦。
    特别解释一下Struct中的对齐问题:
    1. 对齐的时候,编译器会为我们补充padding,从而达到对齐的要求。比如:
    struct {
        
    char a;
        
    int b;
        
    char c;
        
    short d;
    }
    编译出来,内存布局是这样的:

     

    2. 加上__packed关键字(gcc arm编译器这个关键字是__attribute__((__packed__)) ),编译器就不会为我们添加padding,从而节省内存。这样,当发生unalignment address被访问时,编译器会多生成一条汇编,从align的地址读,读到我们需要的内容结束后,再返回我们需要的值,这样做牺牲性能,保证不出错。
    __packed struct {
        
    char a;
        
    int b;
        
    char c;
        
    short d;
    }
     

     

    3. 编译器不会移动struct中member的位置,来达到减少padding的目的。编译器只是挨个处理每个member,遇到需要padding的就padding。

    4. 最好的编程习惯是,遇到不align的struct,自己添加一些padding,这样做有两个好处:
    (1). 添加的dummy member说不定将来就可以作为一个新member,增加扩展性。
    (2). 程序的可移植性好,不需要使用__packed这样的东西了。
    5. Refer to <<ARM System Developer Guide>> for more details. 
  • 相关阅读:
    hdu 5087(次长上升子序列)
    hdu 5086(递推)
    hdu 5084(矩阵操作)
    hdu 5083(模拟)
    hdu 5082(水题)
    高数准备:
    ★ phpStudy安装SSL证书实现https链接
    phpStudy环境安装SSL证书教程
    Qt中切换窗口功能的实现
    LeetCode OJ:Reverse Linked List II(反转链表II)
  • 原文地址:https://www.cnblogs.com/super119/p/1901542.html
Copyright © 2011-2022 走看看