【问题标题】:What does it mean for memory to be allocated at "compile time"? [duplicate]在“编译时”分配内存是什么意思? [复制]
【发布时间】:2021-10-23 09:41:20
【问题描述】:

我的理解是,堆栈、虚拟表、静态变量等静态内存都是在“编译时”分配的,而不是在运行时分配的动态内存。但我对这意味着什么感到困惑。据我了解,编译器/链接器解释编写的代码,将其翻译成机器语言,然后将其组装成可执行文件。是否暗示堆栈和所有静态内存都是可执行文件本身的一部分?

【问题讨论】:

  • 嗯,首先,堆栈并不是真正的静态内存。它通常被实现为在加载时分配给程序的内存区域。其他内容(如全局静态变量)可能由链接器编码到可执行文件中,但这不是必需的。

标签: c++ stack compile-time static-memory-allocation


【解决方案1】:

我的理解是堆栈之类的静态内存……都是在“编译时”分配的

有点。在编译时确定进入块时如何分配内存。但是分配直到运行时才会发生。

是否暗示堆栈和所有静态内存都是可执行文件本身的一部分?

取决于你的意思。可执行文件确实包含有关将分配的内存的信息。例如,如果编译器知道它需要在堆栈上分配 64 个字节,那么就会有一条指令将帧指针调整 64 个字节(或类似的东西)。

这些都不是由语言本身指定的,所以一切都取决于语言实现来决定,并且在不同的语言实现之间有所不同。我的解释被简化并描述了一种假设的语言实现,可能与您使用的任何语言实现都不准确。

【讨论】:

  • 好吧,与其说内存是在编译时分配的,而是编译后的程序确切地知道它在执行时静态数据需要多少内存?
  • @NickyBugs 确实如此。为什么程序在执行之前会消耗内存?
  • 是的,这就是我所咨询的每个来源都使用的“在编译时分配”的措辞让我感到困惑的原因。
猜你喜欢
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 2016-11-26
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多