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

标签 c memory memory-management linux-kernel

我的问题分为两部分。

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

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

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

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

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

谢谢

最佳答案

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

“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 .

关于c - 如何检查内存地址在 C 中是否为 32 位对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19190502/

相关文章:

string - 德尔福: how to completely remove String from the memory

Go slice 存储在动态内存或静态内存中

c - 获取 strtok 的最后一个标记

C练习任务(递归)

c - 强制使用 `exec` 创建的程序执行无缓冲 I/O

objective-c - 为什么 Cocoa 应用程序使用这么多内存?

c++ - std::vector<std::array<T, N>> 或 std::array<std::vector<T>,N> 类型的数组如何存储在内存中?

docker - 为特定的Docker容器Debian设置max_map_count

c++ - 双重自由或腐败 C++

c - K&R C 示例 1.9 的段错误