目录
结构体对齐:
为什么要进行内存对齐?
关于结构体的详解文章:C语言结构体详解_结构体变量和结构体类型举例-CSDN博客
结构体对齐:
存储的时候和当前存储的成员类型字节大小和默认对齐数比较,取小值
存在该对齐数的整数倍位置
即存a的时候,和a的对齐数比;存b的时候和b的对齐数比
而总体的最后的结构体的大小,要看最大对齐数的整数倍
这最大对齐数是结构体内所有变量的对齐数,取最大值和默认对齐数比,取小值
二者要区分开来
为什么要进行内存对齐?
一般来说,进行内存对齐是为了提高效率
那么,问题来了:
是怎么提高效率的?
同时在思考这个问题之前,先思考一个问题:
如果不进行内存对齐,会怎么样?又或者说,效率是怎么样的低?低在哪里?
我们对不内存对齐进行分析一下:
假设两个变量:char i 和 int a
很明显,如果不进行内存,就是5个字节
那么,问题来了,怎么访问?
首先,我们要明确一个问题:
那就是计算机是怎么访问数据的?
注意,计算机访问数据只能访问4/8个字节
为什么?
因为硬件的问题
计算机只有32根线或者64根线
每一根线代表一个电信号,要么1,要么0
32根线就是32位,4个字节;64根线就是64位,8个字节
那,为什么只能访问4个或者8个呢?
多了不行,难道少了不行吗?
我访问3个行不行?2个行不行?1个行不行?
可以,没问题。
但是,一次最低消耗要么是32位(4字节),要么是64位(8字节)( 我总不能减掉几根线吧?)
既然最低消耗是那么多,总不能浪费吧?
例如,你只想喝一口水,要扔一个桶到井里打水,你不会真的只打一口水吧?
那么大个桶,别浪费啊,利用到底啊,直接打一桶岂不更好?
所以规定访问的时候,要么4字节要么8字节
所以,如果不进行内存对齐:(如果是32位机器)
访问第一个char,一个字节,只需要访问一次
访问第二个元素int,四个字节,但是注意,只能从0-3访问四个字节,或者从4位置开始往后访问4-7四个字节
此时,访问第二个int类型的数据,就需要访问两次:
为什么?
第一次访问,int只拿到了前3个字节
还少一个字节,需要访问第二次:拿到int的后1个字节
再将两个部分拼凑在一起,组成完整的int数据
别的不说,光是这个步骤,就感觉贼蛋疼,很不爽、不干脆,非常难受
难受就意味着不简单,不简单就意味着复杂,复杂就意味着成本高
所以,不进行内存对齐,访问效率就很低
底在哪里?低在硬件处理的局限性
而如果进行了内存对齐
第一个数据char占据4个字节,第二个数据int占4个字节
都只需要访问一次,效率更快,没有多余的处理
指定对齐数:#pragam back(对齐数)