我在网上搜索,虽然可以找到一些讨论,但没有找到全面的描述。因此,如果有人可以形成一个涵盖有关指针大小的所有内容的答案,那将有很大帮助。答案至少应涵盖以下主题
- 指针的大小取决于什么?
- 架构的哪些特性会影响指针的大小? (详细)
- 编译器如何影响指针的大小?
最佳答案
指针是高级语言提供的抽象;理论上它可以是任何宽度。这完全是编译器的心血来潮。
在实践中,它通常与底层硬件的内存地址宽度有关,因为这通常是编译器实现的最有效的方法。不过也有异常(exception);例如,C++ 的指向成员函数的指针没有直接映射到硬件地址,因为它需要表示两个实体(函数和一些类型的概念)。
但是,即使撇开这些不谈,仍然存在复杂性。例如:
- 在大多数现代硬件上,您的程序将使用虚拟内存地址,而不是物理地址(其宽度可能不同)。除非您正在编写内核空间代码。
- 在某些架构(例如 x86)上,底层硬件展示了一个分段地址空间。这确实很复杂,但主要是由操作系统和虚拟内存系统抽象出来的。但是,如果您正在编写内核空间代码或为非常旧的 x86 编写代码,则必须处理它。
- 在当前的 x86-64 上,(虚拟)内存地址实际上只有 48 位宽。
- x86-64 支持 32 位和 64 位可执行文件。
- 您可能在虚拟机中运行,而虚拟机又可以根据需要执行任何操作(相对于底层物理机)。
关于c++ - 指针的大小是多少?它具体取决于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23185096/