当前位置:编程学习 > C/C++ >>

简单解释 C / C++ 字节对齐

 

首先,引入两个概念“数据类型大小”和“指定对齐值”:

数据类型大小:char 为1 个字节,short 为2 个字节,int 为4 个字节,double为8 个字节等等;

指定对齐值:#pragma pack (value) 所指定的对齐的值,例如g++ 4.5.2 x86 默认值为4;

引入一个重要的概念——有效对齐值N:

有效对齐值N =min( (1), (2)),即:“数据类型大小”与“指定对齐值”的最小值。

在C / C++ 语言中,需要同时满足如下A、B两个条件:

条件A:结构体(struct)的数据成员的 起始地址addr_start 需要是有效对齐值N的整数倍,即addr_start % N == 0;

条件B:结构体(struct)的大小必须是 所有成员变量的最大有效对齐值max_N 的整数倍,即sizeof(struct) % max_N == 0。

例如:

 

struct a { 

        char a1; 

        short a2; 

        short a3; 

        double a4; 

        int a5; 

        char a6; 

}; 

笔者机器的默认指定对齐值为4,分析:

a1 的有效对齐值为1,起始地址为0,占1 个字节;

a2 的有效对齐值为2,由于条件A,起始地址为2,a1与a2之间 空1 个字节,a2占2 个字节;

a3 的有效对齐值为2,由于条件A,起始地址为4,没有间隔,a3 占2 个字节;

a4 的有效对齐值为4,由于条件A,起始地址为8,没有间隔,a4 占8 个字节;

a5 的有效对齐值为4,由于条件A,起始地址为12,没有间隔,a4 占4 个字节;

a6 的有效对齐值为1,由于条件A,起始地址为15,没有间隔,a5 占1 个字节;

由于条件B,最大有效对齐值为4,总长度为4 的倍数, 结构体最后补3 个字节。

所以,上述结构体总共大小为24 个字节

摘自:杨卓荦的技术专栏

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,