在计算机中,一个数据类型在内存中的存储空间是固定的,一般是以字节为单位。但是,某些数据类型在存储的过程中会因为内存对齐的原因,导致一些未被使用的空间,这就是所谓的“杂散”。
而整数类型在内存对齐的过程中,还会涉及到整数边界的问题。当数据不是正好对齐在整数边界上时,就会发生整数边界杂散。
把数据类型存储到内存中时,计算机会根据数据类型的长度和数据在内存中的地址来决定存储的位置。
对于整数类型来说,通常需要按照4字节(32位)或8字节(64位)的大小进行对齐存储。这样做的原因是:一般情况下,CPU 在读取内存时,需要一次性读取整个 CPU 字长的数据,否则将会影响运算速度。而当数据存储在和 CPU 字长不对齐的地址时,CPU 需要额外的操作来读取这个数据,这会降低运算速度。
而当数据的长度不是整数字节大小的倍数时,就会导致整数边界杂散的问题。
整数边界杂散会给程序带来额外的开销。某些程序特别是实时程序需要极致的运算速度,整数边界杂散会导致 CPU 需要额外的指令来读取未对齐数据,从而降低了程序的运行速度。
同时,在多平台开发时,不同的 CPU 有不同的对齐原则,导致数据在不同的 CPU 上存储方式不同,从而可能导致程序的不可移植性。
为了避免整数边界杂散,开发人员需要注意数据类型的长度和存储地址。一般来说,可以使用 C 语言的 #pragma 指令来改变结构体的对齐方式,从而避免整数边界杂散。另外,一些编译器也提供了编译选项来改变对齐方式。