我需要从一个现有的64位值中提取一个内存地址,这个地址指向一个4K数组,起始值是:
0x000000030c486000我需要的地址存储在位51:12中,因此我使用以下命令提取这些位:
address = start >> 12 & 0x0000007FFFFFFFFF这给我留下了一个地址:
0x000000000030c486但是,我正在阅读的文档指出,存储在该地址的数组大小为4KB,并且自然对齐。
我对自然对齐的实际含义感到有点困惑。我知道对于页面对齐的东西,地址通常以'000‘结尾(尽管我可能在这一点上是错的)。
我假设从起始值获取的地址只有40位长,我需要执行额外的位移位操作来排列这些位,以便可以进一步正确地解释它们。
如果有人能就此提供一些建议,我将不胜感激。
谢谢
发布于 2013-03-19 23:34:54
通常,“自然对齐”是指任何项目至少与其自身大小的倍数对齐。例如,一个4字节的对象对齐到一个4的倍数的地址,一个8字节的对象对齐到一个8的倍数的地址,以此类推。
对于数组,通常不是看整个数组的大小,而是看数组的一个元素的大小。
同样,对于struct或union,通常会查看最大元素的大小。
发布于 2013-03-19 23:34:30
自然对齐要求每个N字节访问必须在N的内存地址边界上对齐。我们可以用模运算符来表示这一点: addr %N必须为零。例如:
从地址0x10004访问4字节内存是对齐的(0x10004%4= 0)。
从地址0x10005访问4字节内存未对齐(0x10005%4= 1)。
发布于 2016-04-15 02:46:40
从硬件的角度来看,内存通常被分成一定大小的块,使得块中的任何或所有数据可以在单个操作中被读取或写入,但是任何单个操作只能影响单个块中的数据。
一个典型的80386时代的系统会将内存分组为四字节块。访问完全适合单个块的两字节值或四字节值需要一次操作。如果该值部分存储在一个块中,部分存储在另一个块中,则需要两个操作。
多年来,块的大小已经超过了数据的大小,以至于大多数随机放置的32位值完全可以放在一个块中,但一些处理器可能会出现第二个问题:如果一个块是512位(64字节),并且已知32位字是四个字节(32位)的倍数,则可以从16个位置中的任何一个位置获取该字的每个位。如果不知道单词是对齐的,那么对于单词完全适合块的情况,每个比特可以来自61个位置中的任何一个。从61个选项中快速选择的电路比从16个选项中选择的电路更复杂,并且大多数代码将使用对齐的数据,因此即使在未对齐的字适合单个可访问的块的情况下,硬件可能仍然需要一点额外的时间来提取它。
https://stackoverflow.com/questions/15503537
复制相似问题