结构体对齐的原因
结构体数据对齐准确来说是结构体内存对齐。
先来了解下对齐和非对齐的概率:当cpu需要连续取4个字节的数据时,若数据的起始地址能被4整除,则称其对齐访问,反之,则为非对齐访问。
若数据总线宽度为32位,即cpu一次可读取4字节数据,现代计算机是按字节编址,为什么规定cpu只能从地址为4的倍数开始读,而不能从任意位置开始连续读4个字节?
这需要一定的计算机组成原理知识,这里仅进行简要描述。下面给出简单的主存储器的基本组成框图。
数据总线宽度为32位,所以在按字节编址方式下,每次最多可以存取4个存储单元的内容。MAR给出要存取的地址,经过地址译码器译码后一根字选线有效,读取该行的4个存储单元内容。cpu从地址为4的倍数开始连续读4个字节只需一次访存。有些复杂指令集的cpu(如x86)虽然可以完成非对齐访问,但cpu也不是一次性读出四个字节,而是采取多次读取对齐的内存,然后进行数据拼接,从而实现对非对齐数据的访问。
例如,一个4字节的int型数据被在地址为4,5,6,7的存储单元中,只需一次访问即可读出;若放在地址为2,3,4,5的存储单元中,那么就需要两次访存才能读出。
结构体对齐带来了以下好处:
1、节省内存:特别是在嵌入式软件开发中。
2、硬件要求:许多硬件平台要求数据对齐到特定的内存边界。 如果不满足这些要求,可能会导致硬件异常。
3、性能优化:对齐的数据可以更快地被cpu访问,非对齐的数据可能需要多次内存访问才能完全读取或写入,这会降低性能。
结构体对齐规则
结构体的对齐规则:
第一个成员的首地址为0
每个成员的首地址是自身大小的整数倍
结构体的总大小是其成员中所含最大类型的整数倍
结构体A对齐后占8个字节:
结构体B对齐后占12个字节:
|
|