为什么存在标记指针

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  │ ┌─────────┐ │ │          │ │
│                    │                   │ └─────────┘ │ └──────────┘ │
│ ...                │                   │             │              │
└────────────────────┴───────────────────┴─────────────┴──────────────┘