如何在C中检查内存地址是否为32位对齐

Ami*_*mar 14 c memory memory-management linux-kernel

我的问题有两个部分.

首先,作为这个地址空间的新手,我想知道地址的内存对齐是什么意思.我用Google搜索了一下,但也想在这里提出这个问题,因为我发现这里的答案非常有用.

我的问题的第二部分与对齐和编程有关:如何找到一个地址是否是4字节对齐?在某处我读到:

  if(address & 0x3) // for 32 bit register 
Run Code Online (Sandbox Code Playgroud)

但我真的不知道这是如何检查4字节对齐的.任何人都可以详细解释一下吗?

编辑:如果有人可以在这个主题上绘制图片,那就太棒了.

谢谢

lur*_*ker 27

顺序地址指的是内存中的连续字节.

"4字节对齐"的地址是4字节的倍数.换句话说,地址的二进制表示以两个零(00)结尾,因为在二进制中,它是4(100b)的二进制值的倍数.因此,对4字节对齐地址的测试是:

if ( (address & 0x3) == 0 )
{
    // The address is 4-byte aligned here
}
Run Code Online (Sandbox Code Playgroud)

或者干脆

if ( !(address & 0x3) )
{
    // The address is 4-byte aligned here
}
Run Code Online (Sandbox Code Playgroud)

0x3是二进制的11,或地址的最低两个比特的掩模.

对齐非常重要,因为如果数据项的地址对齐,某些CPU操作会更快.这是因为CPU是基于32位或64位字的.如果4字节对齐,少量数据(例如4个字节)很适合32位字.如果它没有对齐,它可以跨越32位边界并需要额外的内存提取.现代CPU还具有其他优化功能,可提高地址对齐数据的性能.

这是一篇关于对齐和速度主题的示例文章.

这里有一些很好的对齐图.

  • 有些设计(例如 ARM)不仅在未对齐访问方面效率低下,甚至根本不支持硬件 - 程序员必须显式读取各个部分并将它们重新组合在一起。不用说,在那里会避免未对齐的数据,除非按大小打包数据或以需要的格式进行交换。 (2认同)