字节对齐

为什么要字节对齐

https://www.jb51.net/article/84553.htm 1. 不同硬件兼容性。一些平台对某些特定类型的数据只能从某些特定地址开始存取 2. 避免内存需要两次访问才能把一个数据完整的读写

alignas 关键字 实现结构体字节对齐

  • 直接用在struct 关键字的后面加上 alignas(N), N 表示整个结构体中所有变量的最大对齐值, 如果N 小于各个变量的实际大小, 那么 alignas 将被忽略
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct alignas(8) Base {
    int a;
    char b;
    int c;
    };
    // size = 16

    struct alignas(2) Base {
    int a;
    char b;
    int c;
    };
    // size = 12
  • 用在结构体中的单个变量上, 表示该变量的对齐值。如果前面的变量使用了 alignas, 后面的变量没使用或者使用对齐值更小,那么都以前面的对齐值为准, 并且在对齐范围内包含后面的变量;如果后面对齐值比前面大,那么则从新开始计算对齐地址
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    struct BaseSep {
    alignas(64) int a;
    char b;
    };
    // size = 64

    struct BaseSep {
    alignas(64) int a;
    alignas(32) char b;
    };
    // size = 64

    struct BaseSep {
    alignas(64) int a;
    alignas(64) char b;
    };
    // size = 128

attribute((aligned (n))) 方式的

pack(N) 方式


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!