首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自然对齐的存储器地址

自然对齐的存储器地址
EN

Stack Overflow用户
提问于 2013-03-19 23:23:41
回答 3查看 4.8K关注 0票数 5

我需要从一个现有的64位值中提取一个内存地址,这个地址指向一个4K数组,起始值是:

代码语言:javascript
复制
0x000000030c486000

我需要的地址存储在位51:12中,因此我使用以下命令提取这些位:

代码语言:javascript
复制
address = start >> 12 & 0x0000007FFFFFFFFF

这给我留下了一个地址:

代码语言:javascript
复制
0x000000000030c486

但是,我正在阅读的文档指出,存储在该地址的数组大小为4KB,并且自然对齐。

我对自然对齐的实际含义感到有点困惑。我知道对于页面对齐的东西,地址通常以'000‘结尾(尽管我可能在这一点上是错的)。

我假设从起始值获取的地址只有40位长,我需要执行额外的位移位操作来排列这些位,以便可以进一步正确地解释它们。

如果有人能就此提供一些建议,我将不胜感激。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-19 23:34:54

通常,“自然对齐”是指任何项目至少与其自身大小的倍数对齐。例如,一个4字节的对象对齐到一个4的倍数的地址,一个8字节的对象对齐到一个8的倍数的地址,以此类推。

对于数组,通常不是看整个数组的大小,而是看数组的一个元素的大小。

同样,对于structunion,通常会查看最大元素的大小。

票数 5
EN

Stack Overflow用户

发布于 2013-03-19 23:34:30

自然对齐要求每个N字节访问必须在N的内存地址边界上对齐。我们可以用模运算符来表示这一点: addr %N必须为零。例如:

从地址0x10004访问4字节内存是对齐的(0x10004%4= 0)。

从地址0x10005访问4字节内存未对齐(0x10005%4= 1)。

票数 2
EN

Stack Overflow用户

发布于 2016-04-15 02:46:40

从硬件的角度来看,内存通常被分成一定大小的块,使得块中的任何或所有数据可以在单个操作中被读取或写入,但是任何单个操作只能影响单个块中的数据。

一个典型的80386时代的系统会将内存分组为四字节块。访问完全适合单个块的两字节值或四字节值需要一次操作。如果该值部分存储在一个块中,部分存储在另一个块中,则需要两个操作。

多年来,块的大小已经超过了数据的大小,以至于大多数随机放置的32位值完全可以放在一个块中,但一些处理器可能会出现第二个问题:如果一个块是512位(64字节),并且已知32位字是四个字节(32位)的倍数,则可以从16个位置中的任何一个位置获取该字的每个位。如果不知道单词是对齐的,那么对于单词完全适合块的情况,每个比特可以来自61个位置中的任何一个。从61个选项中快速选择的电路比从16个选项中选择的电路更复杂,并且大多数代码将使用对齐的数据,因此即使在未对齐的字适合单个可访问的块的情况下,硬件可能仍然需要一点额外的时间来提取它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15503537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档