数据对齐
今天看项目的老代码,发现了几个有意思的宏还有一些没见过的库函数。所以接触到了一个新的概念——数据对齐。
百度了一下数据对齐,发现好多相关内容。
数据对齐——计算机系统对基本数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(2,4,8)的倍数。这个是数据对齐的概念,要理解数据对齐就必须知道数据对齐的原因或者说意义。在看代码的时候发现了一个很敏感的数字(4096),凡是出现这数字的地方基本都和二进制脱不了干系。
先说个例子,如果在程序中要存放几个变量,有整形(int)、有浮点型(float)或是字符型(char),那么存取这几个变量需要多大的地址空间呢?我们知道,计算机系统是将物理内存以字节为单位进行编址。那么无论在32位/64位系统中,不同类型变量的存储大小必定不同。但是不同平台下计算机系统的读取和传送都有各自的规则。如果数据没有按照各自的规则,那么可能读取某个数据需要两个甚至更多指令周期。无疑这会损失性能。而数据对齐要做的就是将数据按照符合该平台规则下进行存储,以满足大量连续读取数据时的性能最优。
一句话,以牺牲存储空间为代价,达到性能上的提升。空间换时间,经典永不过时。
而在项目里对文件进行数据对齐时,为什么会是4096而不是1024或其他1024的整数倍呢?磁盘上的存储空间最小的单位被称为扇区,传统上一个扇区有512byte大小,而现在高性能的硬盘上一个扇区都是4096byte大小。虽然还支持向下兼容512byte,但不进行4k对齐会损失性能。所以我想这就是旧代码编写者以4096进行数据对齐的意图了吧!

浙公网安备 33010602011771号