一.背景故事: 易语言本身是不支持直接进行内存的指针操作的,但是在易语言的程序开发过程中,很可能会用到和内存相关的内容,这时候我们就会使用一些额外的办法(API ,第三方库,等)方法来进行内存方面的操作。但由于内存是系统敏感的东西,内存中的数据都是有保护的,如果我们不慎读取了不可操作的内存,就会导致程序的崩溃,c00000005 ,这样就是操作了不可用的内存。 那么操作内存,经常用的是将一个内存的地址转换为一个结构体,这样我们才能直接对数据进行操作,那么在转换的时候,我们需要得到内存指针处数据的长度,这个长度非常的关键,如果长度过短,导致数据无法完全读取,还有可能导致读取类型不对或者崩溃;另外,如果我们给的长度过长,就会导致程序读取到其他的地方的内存,引发崩溃。 二.内存对齐: 首先我们需要了解什么是内存对齐? 百度引用: 大部分的参考资料都是如是说的: 1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。 2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。 上面是百度百科给出的说明,实际上就是让系统调用的时候能够更快的定位到内存,然后读取内容。 三.内存对齐方法: 由于易语言使用的是默认的C编译器 进行编译连接,所以我们忽略其他的方法,包括“#pragma pack”。 1. 【整数倍】数据类型中的第一个成员放在一个偏移为0的位置,以后每个成员的起始位置都是从该自定义数据类型中每一个成员的整数倍开始。 2. 【倍数】通过计算,我们得到了数据类型的长度。必须是其内部最大成员长度的整数倍.不足的要补齐,具体看例子。 例子: 因为28 除以8不能整除,所以必须要补位。这个补的操作由系统内部进行。 最终的长度为32。这样这个就已经字节对齐了。 如果上面这个不明显,我们来看看下面这个C语言版更加直观: 短整数长度:2,double长度:8,那么对齐的结果就应该是: 16
|