c++ - 指针的大小是多少?它具体取决于什么?

标签 c++ c pointers memory

我在网上搜索,虽然可以找到一些讨论,但没有找到全面的描述。因此,如果有人可以形成一个涵盖有关指针大小的所有内容的答案,那将有很大帮助。答案至少应涵盖以下主题

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

最佳答案

指针是高级语言提供的抽象;理论上它可以是任何宽度。这完全是编译器的心血来潮。

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

但是,即使撇开这些不谈,仍然存在复杂性。例如:

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

关于c++ - 指针的大小是多少?它具体取决于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23185096/

相关文章:

c - cryptsetup中dm_task_create的实现在哪里?

c - "..."c 静态函数的最后一个参数

c++ - unique_ptr 到 char* 的转换

c++ - 唯一指针和 const 正确性

c++ - 在 C++ 中,迭代器,为什么有时我使用它有时使用 *it?

c++ - std::replace 有困难

c++ - return 语句何时会中断函数?

c - 如何处理更改 ctrl+c 和 ctrl+z 的信号?

c++ - 将秒(时钟)转换为十进制格式

C++: LINK : debug\XXXXX.exe not found 或不是由最后一个增量链接构建的;执行完整链接