对齐与数据大小和寻址有关。大多数指令集/软件的寻址以字节为单位。0,1,2,3 都是有效的字节地址。假设您正在访问的内存系统或外围设备是“字节可寻址”的,基本上您可以向其写入单个字节,您通常有允许您使用任何地址值的指令。当你有超过一个字节时开始对齐,两个字节,如果对齐意味着地址的lsbit为零,未对齐意味着它是一。四个字节,32 位数量,低两位为零,对齐,一个或两个不为零,不对齐,依此类推。可以将其视为模数,您想要一个模数 4 = 0 在 4 字节边界上对齐的地址。
现在通常作为一名软件工程师,您不会故意让自己处于需要在地址 5 处获取 10 个字节的情况下,您可能会在 0x4 处执行 12 个字节或在 0x0 处执行 16 个字节或类似的事情,即使您只使用 10其中你会更合乎逻辑地对齐它们。外部影响、网络数据包、文件系统、共享内存、硬件等,任何时候你跨越一个编译域,你都可能不得不处理这个问题并采取相应的行动。10 个字节是半有趣的,这取决于您是尝试将这些字节复制到另一个同样糟糕的地址,还是只是读取它们或写入它们。如果阅读,您可能只想在地址 0x4 处读取 12 个字节并完成它。如果写得好,您可以在一个漂亮的循环中完成所有 10 个操作,或者一次展开一个字节,您可以在 0x5 写入一个,在 0x6 写入两个,在 0x8 写入四个,在 0xC 写入两个,在 0xE 写入一个,或一个在 0x5,一个循环或展开的 4 个 16 位值,从 0x6 开始,然后在 0xE 一个字节。等等。
既然您说阅读,您可以在 0x4 处读取 3 个 32 位数量或从 0x0 开始读取两个 64 位数量。这在很大程度上取决于您打算如何处理数据以及您使用的指令集等。10 字节读取的循环可能是最干净/最简单的读取、维护等。
如果您想知道对齐与未对齐,那么就像我上面提到的那样,您可以做一个
8 bit access at 0x5
16 bit access at 0x6
32 bit access at 0x8
16 bit access at 0xC
8 bit access at 0xE
正如我一直说的那样,对于可能不是最有效的读取。对于写入,您可以读取修改写入 32 或 64 位数量或我上面提到的组合。