我的问题分为两部分。
首先,作为这个地址空间的新手,我想知道地址的内存对齐是什么意思。我用Google搜索了一下,但我想在这里提出这个问题,因为我发现这里的答案非常有用。
我的问题的第二部分与对齐和编程有关:如何找到一个地址是否是4字节对齐? 在某处我读到:
if(address & 0x3) // for 32 bit register
但我真的不知道这是如何检查4字节对齐的。 任何人都可以详细解释一下吗?
编辑:如果有人可以在此主题上绘制图片,那就太棒了。
谢谢
答案 0 :(得分:24)
顺序地址是指内存中的连续字节。
“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。