为什么存在标记指针

问题描述

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

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

为什么会这样?
指针是否只有 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  │ ┌─────────┐ │ │          │ │
│                    │                   │ └─────────┘ │ └──────────┘ │
│ ...                │                   │             │              │
└────────────────────┴───────────────────┴─────────────┴──────────────┘