何时将内存分配给C ++中的静态变量

时间:2010-07-17 05:49:56

标签: c++ memory static initialization

我是C ++的新手,遇到了问题。

我在一本书中读到,一旦创建了该类的对象,就会将内存分配给静态变量。现在,如果我将这个静态变量设为全局怎么办?什么时候会在那种情况下初始化?

另外,我还在一些文章中读到静态变量是在堆上分配的,它们不依赖于对象的构造......这是真的吗?如果是,请向我解释内存初始化步骤,我需要帮助。

非常感谢!

3 个答案:

答案 0 :(得分:28)

第一:停止思考C和C ++中的全局变量,否则你会使你的混乱局面永久化。这个问题比例如Python或Pascal更复杂,因此您不能只使用单个词来表示概念。

其次,没有“堆”或“堆栈” - 这些是操作系统和CPU细节,与抽象C ++语言规范无关。

现在,变量有1)范围,2)链接和3)存储类。 static关键字用于影响所有这三个方面,具体取决于您使用它的位置。

范围:声明变量的位置。如果在函数内,它是函数作用域,如果在函数之外,它是文件范围(你可能称之为“全局变量”)。

链接:是否可以从其他编译单元访问变量(当程序包含多个源文件时相关)。

存储类

静态变量在程序启动时以实现定义的方式分配,并且它们一直存在直到程序结束。它们不能被“释放”或“重新分配”。 (典型的实现是其他人提到的BSS和DATA段)。

自动变量仅存在于函数范围内,它们在函数入口上分配(并可能初始化)(通常在CPU的堆栈上)并在函数出口处解除分配。

动态存储类是您可能引用的“堆”。这些变量的存储直接通过malloc / free或new / delete进行操作。静态变量的存储以与动态存储非常不同的方式进行管理,这两种存储从根本上是不兼容的。

示例:

===
// ALL file-scope variables have static storage class
int global1;        // file-scope, external linkage
static int global2; // file-scope, internal linkage

void f()
{
  static int x;     // static storage class, function-scope
  int y;            // automatic storage class, function-scope

  free(&x);         // ILLEGAL, WILL CRASH!
  free(&y);         // DITTO!
  free(&global1);   // DITTO!
}
===

现在,所有带有静态存储类(global1,global2和x)的变量都会在程序启动之前进行分配和初始化。如果未指定初始值,则会在“缺省订单”中对其进行默认初始化。 (对于原始类型,这只意味着填充零)。

仅在程序退出时释放静态变量。这意味着,函数f中的'x'将仅在初始化时(在程序启动时)并且它将在函数的调用之间保持其值(与将在每个函数入口上分配并在每个函数处取消分配的y相对)退出,因此它的价值也被破坏了)。请注意,在函数中使用静态变量与多线程和重入非常不兼容,unles你很清楚自己在做什么。

答案 1 :(得分:9)

静态变量根本没有存储在堆中。

未初始化的静态变量存储在BSS段中。

初始化的静态变量存储在数据段中。

你可以阅读这篇文章,它以一种很好的方式解释了所有这些内容: http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory

答案 2 :(得分:1)

在programstart(在main之前),将为您的静态全局变量分配内存。

我不知道第二个问题。