数据对齐

1. 定义

数据结构对齐是指在计算机存储器中排列和访问数据的方式。它由三个独立但相关的问题组成:数据对齐,数据结构填充和打包。

  1. 数据对齐:当存储地址a是n 个字节的倍数(其中n是2的幂)时,a就被称为n字节对齐。
  2. 数据结构填充:当数据结构中有不同对齐要求的成员时,为了保持正确的对齐,编译器通常会插入其他未命名的数据成成员。

2. 益处

通常当数据地址是数据大小的倍数时,CPU能最有效地执行对存储器的读写。

3.例子

数据结构成员按顺序存储在内存中。结构的每个成员的类型通常默认对齐,这意味着除非程序员另外请求,否则它将在预定边界上对齐。

在32位x86时,以下典型的对齐适用于Microsoft(Visual C ++),Borland / CodeGear(C ++ Builder),Digital Mars(DMC)和GNU(GCC)的编译器:

  • char (one byte) :1-byte aligned.
  • short (two bytes) :2-byte aligned.
  • int (four bytes):4-byte aligned.
  • long (four bytes):4-byte aligned.
  • float (four bytes):4-byte aligned.
  • double (eight bytes):8-bytealigned on Windows and 4-byte aligned on Linux.
  • long long (eightbytes):4-byte aligned.
  • Any pointer (four bytes):4-byte aligned(e.g.: char*, int*).

Eg:

struct data {
    char c;
    float n;
    };

该结构体将占用8个字节而非5个字节。
编译后,结构体将填充字节:

struct data {
    char c;
    char Padding[3];
    float n;
    };

因float占用4个字节,其存储地址应为4的倍数,因此编译器在前面填充了三个字节。

4. C中的#pragma pack()预处理指令

在结构体中,数据成员对齐模数为min {数据成员所占内存字节数,#pragma pack指定字节数}。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值