指针的大小是多少?它究竟依赖于什么?

时间:2014-04-20 16:53:50

标签: c++ c pointers memory

我在线搜索,虽然我可以找到一些讨论,但我没有找到全面的描述。因此,如果任何人都可以形成一个涵盖指针大小的答案,那将会有很大的帮助。答案至少应包括以下主题

  1. 指针的大小取决于什么?
  2. 架构的哪些特性会影响指针的大小? (详见)
  3. 编译器如何影响指针的大小?

1 个答案:

答案 0 :(得分:16)

指针是由高级语言提供的抽象;理论上它可以是任何宽度。这完全是编译器的一时兴起。

实际上,它通常与底层硬件的内存地址宽度有关,因为这通常是编译器实现的最有效的方法。但也有例外;例如,C ++的指向成员函数的指针没有直接映射到硬件地址,因为它需要表示两个实体(函数和类型的某些概念)。

然而,即使把它放在一边,仍然存在复杂性。例如:

  • 在大多数现代硬件上,您的程序将使用虚拟内存地址,而不是物理地址(宽度可能不同)。除非您正在编写内核空间代码。
  • 在某些体系结构(例如x86)上,底层硬件具有分段地址空间。这非常复杂,但主要是由操作系统和虚拟内存系统抽象出来的。如果您正在为非常旧的x86编写内核空间代码或代码,那么您将不得不处理它。
  • 在当前的x86-64上,(虚拟)内存地址实际上只有48位宽。
  • x86-64支持32位和64位可执行文件。
  • 您可能正在虚拟机内运行,如果需要,它也可以执行任何操作(相对于底层物理机)。