• 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. 
  • 相关阅读:
    Flutter 布局类组件:简介
    Flutter 基础组件:进度指示器
    Flutter 基础组件:单选框和复选框
    Flutter 基础组件:图片和Icon
    Flutter 基础组件:按钮
    Flutter 基础组件:文本、字体样式
    Flutter 基础组件:状态管理
    Flutter 基础组件:Widget简介
    网络编程之TCP
    入门多线程
  • 原文地址:https://www.cnblogs.com/super119/p/1901542.html
Copyright © 2020-2023  润新知