结构体的大小以及内存对齐问题

结构体的大小怎么计算?什么是结构体的对齐?

首先想要直到结构体的大小需要先了解结构体的内存对齐。那么,什么是结构体的内存对齐:

什么是结构体内存对齐

结构体的对齐 就是 结构体类型数据在内存中按照一定的对齐规律储存。结构体的对齐归根结底其实就是用空间换取时间的做法。至于为什么可以用空间换取时间呢?请看这么一张图:

假如一个结构体的数据像图中这样摆放。如果一个cpu读取数据, 是按照8个字节8个字节的规律进行读取。 那么他从a的首地址开始读取,第一次读取可以将int读完, 但是此时只读取了一半的double 类型的b, 想要完全读取b还要再多读取一次,这就造成了时间的浪费。

但是, 如果按照结构体对其规律进行数据存储呢?

这样,我们读取一次读到一个完整的a, 在读取一次读到完整的b。

另外, 并不是所有的硬件都能随意的访问任意地址处的数据。这些硬件可能只能读取特定的地址处的数据。

结构体内存对齐的规律

结构体内存对齐需要遵循对齐数的规律, 即:结构体的第一个成员对齐到结构体首地址处, 其他成员对齐到对齐数整数倍的偏移量处。

**把握住两个点:**成员变量的对齐数、结构体的总大小

成员变量的对齐数:该对齐数为成员变量的大小和编译器默认大小的较小值。

**结构体的总大小:**每个成员变量的对齐数之中最大的那个对齐数的整数倍。

计算结构体的大小的时候, 只要严格遵守这对齐数的使用规则:

1、计算成员变量的偏移量时, 先确定该成员变量的对齐数,偏移量为对齐数的整数倍。

2、计算结构体变量时, 将所有成员变量的对齐数逐个比较一下。取出最大的对齐数,然后结构体的大小就是最大的对其数的整数倍。

下面来看一下练习:

假如创建一个该结构体变量a , 那么a的内存存储是这样的:

我们来验证一下是否正确

综上就是结构体大小的计算方法。

相关推荐
诺....19 分钟前
C语言不确定循环会影响输入输出缓冲区的刷新
c语言·数据结构·算法
清轩轩1 小时前
UDS时间参数学习(应用层+网络层+会话层+传输层)
c语言·can·信息与通信·诊断·uds
誰能久伴不乏2 小时前
深入理解 `poll` 函数:详细解析与实际应用
linux·服务器·c语言·c++·unix
Hard but lovely2 小时前
C/C++ ---条件编译#ifdef
c语言·开发语言·c++
EXtreme353 小时前
栈与队列的“跨界”对话:如何用双队列完美模拟栈的LIFO特性?
c语言·数据结构·leetcode·双队列模拟栈·算法思维
南棱笑笑生3 小时前
20251211给飞凌OK3588-C开发板跑飞凌Android14时让OV5645摄像头以1080p录像
c语言·开发语言·rockchip
tang_shou3 小时前
STM32CubeMx使用STM32F4系列芯片实现串口DMA接收
c语言·arm开发·stm32·单片机·嵌入式硬件·mcu·stm32cubemx
南棱笑笑生3 小时前
20251211给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-6.1】系统时适配adb【type-C0】
linux·c语言·adb·rockchip
say_fall4 小时前
C语言编程实战:每日一题:用栈实现队列
c语言·开发语言
deng-c-f4 小时前
C/C++内置库函数(4):c++左右值及引用的概念、move/forward的使用
c语言·开发语言·c++