[开发资料] C语言结构体数据对齐的原因及规则

[复制链接]
27|0
中国龙芯CDX 发表于 2025-10-16 13:57 | 显示全部楼层 |阅读模式
结构体对齐的原因
结构体数据对齐准确来说是结构体内存对齐。

先来了解下对齐和非对齐的概率:当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个字节:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

342

主题

2690

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部