【问题标题】:Where does C++ place static member variable, in stack or in data segment [closed]C ++在哪里放置静态成员变量,堆栈或数据段[关闭]
【发布时间】:2013-09-15 06:10:19
【问题描述】:

sizeof运算符不计算静态成员变量的大小,所以我猜它在数据段中。我说的对吗?

【问题讨论】:

  • "C++ 将静态成员变量放在哪里,在堆栈中还是在数据段中。" - 这取决于实施。 C++ 标准不关心诸如“可执行段”之类的东西。除了“它可以是任何东西”之外,没有正确的通用答案。
  • @H2CO3 您的普遍看法是正确的,但在这种情况下,将静态成员变量放在堆栈上无法支持 C++ 语言语义。
  • @KevinA.Naudé 然后将其解读为“它可以是堆栈之外的任何东西,如果有的话”。标准中也没有“堆栈”的概念。
  • C++ 标准没有规定堆栈和数据段。那是一个执行问题。实现甚至不需要拥有一个堆栈,只要它可以完成 C++ 虚拟机所需的所有操作。
  • "sizeof算子不计算静态成员变量的大小。"是的。您剩下的问题是不合逻辑的。

标签: c++ memory-management static


【解决方案1】:

猜对了。静态成员本质上是全局变量,但不在全局变量命名空间中。它们的存储在数据段中。

编辑:如果一个实现发现可以将静态成员存储在一些不寻常的存储位置,那没关系。静态成员的语义保持不变,它们的自然存储位置是全局数据。静态成员不是对象实例的一部分,因此它们不计入大小。

我认为这是对这个问题的足够准确的回答,因为没有迹象表明 coinyx 要求 C++ 标准提供正式注释。

我要补充一点,Trojanfoe 对旧版 x86 系统以及可能的其他系统都是正确的。在这种情况下,初始化的变量通常会进入数据段,而未初始化的数据会进入 bss 段。此外,也可以从 bss 段分配主堆栈。其他线程堆栈将分配到其他地方。静态成员不会被认为是堆栈分配的。

【讨论】:

  • Kevin,没有什么能阻止实现在main() 堆栈帧中为所有静态存储持续时间的变量分配大量空间。那在堆栈上 :-) 基本上,标准不要求这种级别的细节,实现可以按照他们的意愿做,只要遵循标准中规定的虚拟机规则。
  • 只有初始化后才会进入数据段;未初始化的全局变量将进入 bss 段。
【解决方案2】:

静态数据,包括静态成员,放置在数据段中。但是为什么你认为sizeof 运算符不计算静态成员变量的大小呢? sizeof 给出变量类型的大小。

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 2014-04-21
  • 2011-01-28
  • 2021-03-11
  • 2012-04-27
  • 1970-01-01
相关资源
最近更新 更多