问题描述
我了解标记指针背后的理论以及如何使用它在指针中保存额外数据。
但我不明白这部分(来自维基百科关于标记指针的文章)。
大多数架构都是字节寻址的(最小的可寻址单位是一个字节),但某些类型的数据通常会与数据的大小对齐,通常是一个字或多个字。这种差异使指针的一些最低有效位未使用
为什么会这样?
指针是否只有 30 位(在 32 位架构上)并且 2 位是对齐的结果?
为什么首先有 2 口未使用?
这是否减少了可寻址空间的大小(从 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 │ ┌─────────┐ │ │ │ │ │ │ │ └─────────┘ │ └──────────┘ │ │ ... │ │ │ │ └────────────────────┴───────────────────┴─────────────┴──────────────┘