【问题标题】:Why tagged pointers exists为什么存在标记指针
【发布时间】:2021-04-14 10:12:32
【问题描述】:

我了解标记指针背后的理论以及如何使用它在指针中保存额外数据。
但我不明白这部分(来自关于标记指针的维基百科文章)。

大多数架构都是字节可寻址的(最小的可寻址单元是一个字节),但某些类型的数据通常会与数据的大小对齐,通常是一个字或多个字。这种差异使指针的一些最低有效位未被使用

为什么会这样?
指针是否只有 30 位(在 32 位架构上)并且 2 位是对齐的结果?
为什么一开始有 2 口未使用?
这是否会减少可寻址空间的大小(从 2^32 字节到 2^30 字节)?

【问题讨论】:

    标签: pointers memory tagging


    【解决方案1】:

    考虑一个使用 16 位对齐和 16 位指针的架构(只是为了避免二进制数字过多!)。指针只会引用 16 的倍数的内存位置,但指针值仍然精确到字节。所以二进制指针是:

    0000000000000100

    指的是内存位置4(内存中的第五个字节):

    ┌────────────────────┬────────────────────┬──────── ──────┬──────────────┐ │ 十进制地址 │ 二进制地址 │ 8─位字节 │ 16位字 │ ├────────────────────┼────────────────────┼──────── ──────┼──────────────┤ │ 0 │ 0000000000000000 │ ┌──────────┐ │ ┌──────────┐ │ │ │ │ └─────────┘ │ │ │ │ │ 1 │ 0000000000000001 │ ┌──────────┐ │ │ │ │ │ │ │ └────────┘ │ └──────────┘ │ │ 2 │ 0000000000000010 │ ┌──────────┐ │ ┌──────────┐ │ │ │ │ └─────────┘ │ │ │ │ │ 3 │ 0000000000000011 │ ┌──────────┐ │ │ │ │ │ │ │ └────────┘ │ └──────────┘ │ │ 4 - 这个 │ 0000000000000100 │ ┌─────────┐ │ ┌──────────┐ │ │ │ │ └─────────┘ │ │ │ │ │ 5 │ 0000000000000101 │ ┌──────────┐ │ │ │ │ │ │ │ └────────┘ │ └──────────┘ │ │ 6 │ 0000000000000110 │ ┌──────────┐ │ ┌──────────┐ │ │ │ │ └─────────┘ │ │ │ │ │ 7 │ 0000000000000111 │ ┌──────────┐ │ │ │ │ │ │ │ └────────┘ │ └──────────┘ │ │ ... │ │ │ │ └────────────────────┴────────────────────┴──────── ──────┴──────────────┘

    使用 16 位对齐,永远不会有指向内存位置 5 的指针,因为它不会对齐,下一个有用的值是 6:

    0000000000000110

    请注意,最低有效位(最右边的那个)仍然是 0。事实上,对于该架构上的所有有效指针值,该位将为 0。这就是它们的意思通过保留 "...指针的一些最低有效位未使用。" 在我的示例中,它只有一位,但如果您有 32 位对齐,它将是 两个 指针值末尾的位始终为零:

    ┌────────────────────┬────────────────────┬──────── ──────┬──────────────┐ │ 十进制地址 │ 二进制地址 │ 8─bit bytes │ 32─bit words │ ├────────────────────┼────────────────────┼──────── ──────┼──────────────┤ │ 0 │ 0000000000000000 │ ┌──────────┐ │ ┌──────────┐ │ │ │ │ └─────────┘ │ │ │ │ │ 1 │ 0000000000000001 │ ┌──────────┐ │ │ │ │ │ │ │ └─────────┘ │ │ │ │ │ 2 │ 0000000000000010 │ ┌──────────┐ │ │ │ │ │ │ │ └─────────┘ │ │ │ │ │ 3 │ 0000000000000011 │ ┌──────────┐ │ │ │ │ │ │ │ └────────┘ │ └──────────┘ │ │ 4 │ 0000000000000100 │ ┌──────────┐ │ ┌──────────┐ │ │ │ │ └─────────┘ │ │ │ │ │ 5 │ 0000000000000101 │ ┌──────────┐ │ │ │ │ │ │ │ └─────────┘ │ │ │ │ │ 6 │ 0000000000000110 │ ┌──────────┐ │ │ │ │ │ │ │ └─────────┘ │ │ │ │ │ 7 │ 0000000000000111 │ ┌──────────┐ │ │ │ │ │ │ │ └────────┘ │ └──────────┘ │ │ 8 │ 0000000000001000 │ ┌────────┐ │ ┌──────────┐ │ │ │ │ └─────────┘ │ │ │ │ │ 9 │ 0000000000001001 │ ┌──────────┐ │ │ │ │ │ │ │ └─────────┘ │ │ │ │ │ 10 │ 0000000000001010 │ ┌──────────┐ │ │ │ │ │ │ │ └─────────┘ │ │ │ │ │ 11 │ 0000000000001011 │ ┌──────────┐ │ │ │ │ │ │ │ └────────┘ │ └──────────┘ │ │ ... │ │ │ │ └────────────────────┴────────────────────┴──────── ──────┴──────────────┘

    【讨论】:

    • 谢谢你的回答,我终于明白它是如何工作的了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2022-01-02
    相关资源
    最近更新 更多