为指针*变量分配了多少内存?

Ano*_*ous 0 c++ pointers allocation memory-address

我的问题:

  • int
  • float
  • char
  • str

这些 var 类型都有为其分配的标准化字节分配。但我从来没有了解过这一点的指针:

这些“地址”存储变量,其内容看起来只是一系列字母数字字符。

C++代码:

int *ptr1;
char *ptr2;
void *ptr3;
Run Code Online (Sandbox Code Playgroud)

那么上面列出的指针的标准内存分配是什么呢?一般来说呢?

Lun*_*din 5

指针的大小是sizeof(ptr1)字节,这就是标准指定的所有内容。理论上,不同的对象指针可以有不同的大小,不同的函数指针也可以有不同的大小。

归根结底,我们在谈论 32 位 CPU 等时通常指的 CPU 数据大小(它可以在单个指令中处理的最大块)不一定对应于地址总线宽度/可寻址内存空间。后者决定了指针的大小。

在实践中(简化):

  • 8 和 16 位微控制器系统以及旧的 16 位 PC 可能具有不同的指针大小,通常在 8 到 32 位之间,其中 16 位最常见。他们通常使用非标准关键字(例如指针限定符)near或far来指示这一点。

    某些 ISA 可能有“零页”,这意味着指向前 256 个地址的 8 位指针,它们可以在其中更快地执行代码/访问数据(通常这将在冯·诺依曼 MCU 上)。同样,它们可以具有超出正常 65536 字节的扩展内存,这可能会导致执行/数据访问速度变慢。24 位指针并不罕见。

  • 32 位系统通常有 32 位指针。

  • 64 位系统通常有 64 位指针。

如果您出于某种原因需要获取绝对地址,那么uintptr_t可移植整数类型应该足够大以容纳给定系统上的任何指针地址。