关于数据对齐(Data Alignment)

本文探讨了数据对齐的原因,包括平台移植和性能考虑。数据对齐涉及不同类型的数据自身对齐值、指定对齐值、结构体对齐值以及有效对齐值。介绍了在Windows和Linux下的数据对齐规则,并通过测试展示了对齐如何影响内存使用和效率。最后,提到了64位系统下的变化和指针、long double的数据大小差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于数据对齐 About Data Alignment

数据对齐的由来

1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:为了访问未对齐的内存,处理器需要作多次内存访问,然而,对齐的内存访问仅需要一次访问。这对于效率而言有一定的下降。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)存放在偶地址开始的地方 ,那么读一个周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要读2个周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。

相关概念

1)数据类型自身的对齐值:基本数据类型的自身对齐值,等于sizeof(基本数据类型)。(在不同的平台下有可能不同,如Windows下的数据对齐即为任何K字节基本对象的地址都必须是K的整数倍,而在linux32位下,沿用的对齐策略是,2字节的数据类型的地址必须是2的倍数,而较大的数据类型如 int int* float double 的地址是4的倍数。)

2)指定对齐值:#pragma pack (value)时的指定对齐值value。

3)结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。

4)数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小的那个值。

有效对齐值N是最终用来决定数据存放地址方式的值,最重要。有效对齐N,就是表示“对齐在N上”,也就是说该数据的”存放起始地址%N=0”.而数据结构中的数据变量都是按定义的先后顺序来排放的。第一个数据变量的起始地址就是数据结构的起始地址。结构体的成员变量要对齐排放,结构体本身也要对齐对自身的对齐值,就是结构体成员变量占用总长度需要是对结构体有效对齐值的整 数倍。

数据对齐测试

保持数据对齐可以提高效率,其代价就是损耗了一部分的内存空间,典型的是通过空间来换取时间的案例。
数据对齐和平台是紧密相关的,不同平台下的对齐原则也不尽相同,首先介绍Windows下的数据对齐:
1.默认情况下,任何K字节基本对象的地址都必须是K的整数倍。
通常情况下,基本数据类型的字节数目为下:(然而并不是绝对的,如int类型,C标准只要求其最小拥有16位,即两个字节)
char 1
short 2
int 4
unsigned 4
long 8
unsigned long 8
float 4
doule 8
void * 4
long double 8
同时需要注意的是,在许多平台下long double实际上需要10个字节,但实际中会分配12(32位下)或者是16(64位下)个字节,这是为了读取效率。但在vs2010下测试时发现long double是8字节。

在vs2010下进行测试,选定”结构成员对齐”为默认设置,此时则按照默认对齐规则进行字节对齐。即任何K字节基本对象的地址都必须是K的倍数。假设下面每个结构体的起始地址均为0。

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值