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

Posted

技术标签:

【中文标题】如何检查内存地址在 C 中是不是为 32 位对齐【英文标题】:How Do I check a Memory address is 32 bit aligned in C如何检查内存地址在 C 中是否为 32 位对齐 【发布时间】:2013-10-11 23:59:28 【问题描述】:

我的问题分为两部分。

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

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

  if(address & 0x3) // for 32 bit register 

但我真的不知道这是如何检查 4 字节对齐的。 谁能详细解释一下?

编辑:如果有人能画出关于这个主题的图片,那就太好了。

谢谢

【问题讨论】:

【参考方案1】:

顺序地址是指内存中的顺序字节。

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

if ( (address & 0x3) == 0 )

    // The address is 4-byte aligned here

或者干脆

if ( !(address & 0x3) )

    // The address is 4-byte aligned here

0x3 是二进制的11,或者是地址最低两位的掩码。

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

这是一篇关于alignment and speed主题的示例文章。

这里有一些不错的diagrams of alignment。

【讨论】:

有些设计(例如 ARM)不仅在非对齐访问方面效率低下,甚至在硬件上根本不支持它——程序员必须明确地读取这些部分并将它们重新组合在一起。不用说,这里会避免未对齐的数据,除非根据大小包装东西或以需要它的格式交换。 感谢@mbratch 的回复,如果Harware 设备上的所有寄存器都是32 位的,那么它们是否必须是4 字节对齐的。是真的吗?? 对于上述情况,如果地址不是 4 字节对齐,还有一点@mbratch,是否有机会访问不需要的寄存器?? 有时您可能希望将其置于宏形式,甚至是在所有翻译单元或源中更可用的形式,在 *** 上的此链接中,您可以获得一些宏。 ***.com/questions/1898153/… 你太棒了!并且介绍的那些链接真的很棒!我终于明白对齐了。非常感谢。

以上是关于如何检查内存地址在 C 中是不是为 32 位对齐的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 中分配和释放对齐的内存

内存对齐原理

检查 IP 地址是不是在范围/子网内的标准/安全方法

C语言精要总结-内存地址对齐与struct大小判断篇

C语言精要总结-内存地址对齐与struct大小判断篇

如何在 C 中分配 32 字节对齐的内存