C/C++字节对齐

来源:互联网 发布:it行业工资 编辑:程序博客网 时间:2024/06/14 09:40

1 背景

    需要字节对齐的根本原因在于CPU访问数据的效率问题数组 ,对于标准数据类型,它的地址只要是它的长度的整数倍就行了,而非标准数据类型按下面的原则对齐:

    数组 :按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。 

    联合 :按其包含的长度最大的数据类型对齐。 

    结构体: 结构体中每个数据类型都要对齐。

    本文重点分析结构体的对齐方式。

2 结构体中字节对齐的案例分析

2.1 结构体一

struct A {     char a;  // 1字节对齐    int b;   // 4字节对齐    short c; // 2字节对齐} a;         // 由于本结构体最大的成员是4字节对齐,因此本结构体整体以4字节对齐
    字节对齐情况:

sizeof(A) = 12; // struct A以4字节对齐,因此后面补充两个字节&a.a = 0;&a.b = 4;       // 地址4字节对齐&a.c = 8;
2.2 结构体二
struct A {     char a;    // 1字节对齐    short b;   // 2字节对齐    int c;     // 4字节对齐};
   字节对齐情况:
sizeof(A) = 8;&a.a = 0;&a.b = 2;   // 地址2字节对齐&a.c = 4;   // 地址4字节对齐

3 g++中设置直接对齐的方法: __attribute__((packed))

#include <stdint.h>struct A {    uint16_t cmd;    uint32_t size;} __attribute__ ((packed));int main(void){    printf("sizeof(A) = %d\n", sizeof(A));}

    如上所示,添加了__attribute__((packed))后,A占用的空间为6字节,而不是8字节。

[1]C语言字节对齐

[2]5分钟搞定内存字节对齐

0 0