为什么存在标记指针
Why tagged pointers exists
我了解标记指针背后的理论以及如何使用它在指针中保存额外数据。
但是我不明白这部分(来自维基百科关于标记指针的文章)。
Most architectures are byte-addressable (the smallest addressable unit is a byte), but certain types of data will often be aligned to the size of the data, often a word or multiple thereof. This discrepancy leaves a few of the least significant bits of the pointer unused
为什么会这样?
指针是否只有 30 位(在 32 位体系结构上)并且 2 位是对齐的结果?
为什么一开始还有 2 口未使用?
这是否会减少 addresable space 的大小(从 2^32 字节到 2^30 字节)?
考虑使用 16 位对齐和 16 位指针的架构(只是为了避免有太多的二进制数字!)。指针将永远只引用 16 的倍数的内存位置,但指针值仍然精确到字节。所以一个指针,在二进制中是:
0000000000000100
指内存位置4(内存中第5个字节):
┌────────────────────┬───────────────────┬─────────────┬──────────────┐
│ Address in Decimal │ Address in Binary │ 8─bit bytes │ 16─bit words │
├────────────────────┼───────────────────┼─────────────┼──────────────┤
│ 0 │ 0000000000000000 │ ┌─────────┐ │ ┌──────────┐ │
│ │ │ └─────────┘ │ │ │ │
│ 1 │ 0000000000000001 │ ┌─────────┐ │ │ │ │
│ │ │ └─────────┘ │ └──────────┘ │
│ 2 │ 0000000000000010 │ ┌─────────┐ │ ┌──────────┐ │
│ │ │ └─────────┘ │ │ │ │
│ 3 │ 0000000000000011 │ ┌─────────┐ │ │ │ │
│ │ │ └─────────┘ │ └──────────┘ │
│ 4 - this one │ 0000000000000100 │ ┌─────────┐ │ ┌──────────┐ │
│ │ │ └─────────┘ │ │ │ │
│ 5 │ 0000000000000101 │ ┌─────────┐ │ │ │ │
│ │ │ └─────────┘ │ └──────────┘ │
│ 6 │ 0000000000000110 │ ┌─────────┐ │ ┌──────────┐ │
│ │ │ └─────────┘ │ │ │ │
│ 7 │ 0000000000000111 │ ┌─────────┐ │ │ │ │
│ │ │ └─────────┘ │ └──────────┘ │
│ ... │ │ │ │
└────────────────────┴───────────────────┴─────────────┴──────────────┘
使用 16 位对齐,永远不会有指向内存位置 5 的指针,因为它不会对齐,下一个有用的值是 6:
0000000000000110
请注意,最低有效位(最右边的那个)仍然是 0。事实上,对于该体系结构上的 所有 有效指针值,该位将为 0 . 这就是他们留下 的意思“......指针的一些最低有效位未使用。” 在我的示例中它只是一位,但如果你有 32 位对齐,指针值末尾的 两个 位始终为零:
┌────────────────────┬───────────────────┬─────────────┬──────────────┐
│ Address in Decimal │ Address in Binary │ 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 │ ┌─────────┐ │ │ │ │
│ │ │ └─────────┘ │ └──────────┘ │
│ ... │ │ │ │
└────────────────────┴───────────────────┴─────────────┴──────────────┘
我了解标记指针背后的理论以及如何使用它在指针中保存额外数据。
但是我不明白这部分(来自维基百科关于标记指针的文章)。
Most architectures are byte-addressable (the smallest addressable unit is a byte), but certain types of data will often be aligned to the size of the data, often a word or multiple thereof. This discrepancy leaves a few of the least significant bits of the pointer unused
为什么会这样?
指针是否只有 30 位(在 32 位体系结构上)并且 2 位是对齐的结果?
为什么一开始还有 2 口未使用?
这是否会减少 addresable space 的大小(从 2^32 字节到 2^30 字节)?
考虑使用 16 位对齐和 16 位指针的架构(只是为了避免有太多的二进制数字!)。指针将永远只引用 16 的倍数的内存位置,但指针值仍然精确到字节。所以一个指针,在二进制中是:
0000000000000100
指内存位置4(内存中第5个字节):
┌────────────────────┬───────────────────┬─────────────┬──────────────┐ │ Address in Decimal │ Address in Binary │ 8─bit bytes │ 16─bit words │ ├────────────────────┼───────────────────┼─────────────┼──────────────┤ │ 0 │ 0000000000000000 │ ┌─────────┐ │ ┌──────────┐ │ │ │ │ └─────────┘ │ │ │ │ │ 1 │ 0000000000000001 │ ┌─────────┐ │ │ │ │ │ │ │ └─────────┘ │ └──────────┘ │ │ 2 │ 0000000000000010 │ ┌─────────┐ │ ┌──────────┐ │ │ │ │ └─────────┘ │ │ │ │ │ 3 │ 0000000000000011 │ ┌─────────┐ │ │ │ │ │ │ │ └─────────┘ │ └──────────┘ │ │ 4 - this one │ 0000000000000100 │ ┌─────────┐ │ ┌──────────┐ │ │ │ │ └─────────┘ │ │ │ │ │ 5 │ 0000000000000101 │ ┌─────────┐ │ │ │ │ │ │ │ └─────────┘ │ └──────────┘ │ │ 6 │ 0000000000000110 │ ┌─────────┐ │ ┌──────────┐ │ │ │ │ └─────────┘ │ │ │ │ │ 7 │ 0000000000000111 │ ┌─────────┐ │ │ │ │ │ │ │ └─────────┘ │ └──────────┘ │ │ ... │ │ │ │ └────────────────────┴───────────────────┴─────────────┴──────────────┘
使用 16 位对齐,永远不会有指向内存位置 5 的指针,因为它不会对齐,下一个有用的值是 6:
0000000000000110
请注意,最低有效位(最右边的那个)仍然是 0。事实上,对于该体系结构上的 所有 有效指针值,该位将为 0 . 这就是他们留下 的意思“......指针的一些最低有效位未使用。” 在我的示例中它只是一位,但如果你有 32 位对齐,指针值末尾的 两个 位始终为零:
┌────────────────────┬───────────────────┬─────────────┬──────────────┐ │ Address in Decimal │ Address in Binary │ 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 │ ┌─────────┐ │ │ │ │ │ │ │ └─────────┘ │ └──────────┘ │ │ ... │ │ │ │ └────────────────────┴───────────────────┴─────────────┴──────────────┘