- 一般计算机架构中都会有地址总线和数据总线, 地址总线一般决定了机器可访问内存的大小, 比如8086PC有20条地址总线, 可访问的内存为2的20次方共1048576个字节(1MB); 数据总线则决定了机器单次读写可处理数据的大小, 8086CPU有16条数据总线, 每次可传送给CPU的数据大小最多为16位(2Byte).
- 通常我们所说的 “计算机是64位的” “32位的系统” 等指的是机器的数据总线的条数.
- 一般对于32位机器来说, 处理器一次可访问 1Byte(8Bit) 2Byte(16Bit) 4Byte(32Bit).
字节对齐 指的是当处理器访问单个字节时, 对访问的起始地址不作要求; 当访问多个 (n个) 字节时, 要求所访问的起始地址满足 n 的倍数.
下图显示了一个32位机器如何正确的访问内存.
注意:
- 内存对齐并不是说要访问多少字节就要求起始地址为多少的整数倍, 比如在32位机器上要访问8字节, 由于32位机器一次最多访问4字节, 所以8字节就会拆分为两个4字节分两次访问, 起始地址只要是4的倍数就行.
- 对于不同的处理器, 当寻址不满足字节对齐要求时所造成的结果也不同. 有的会引发总线异常导致系统崩溃, 有的不会引发异常但是会造成访问性能降低, 有的会读取到错误的数据, 造成数据失真.
- 关于 如何自定义对象的字节对齐方式? 见这里