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

Ish*_*shi 10 c++ memory static initialization

我是C++的新手,面临一个问题.

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

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

非常感谢 !

zvr*_*rba 29

第一:停止思考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!
}
===
Run Code Online (Sandbox Code Playgroud)

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

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

  • 注意:这并非完全没有说明.同一编译单元中的所有文件范围变量都按声明/定义的顺序初始化.只是没有指定编译单元之间的顺序是什么(或者即使在初始化期间交织了不同编译单元中的文件范围变量). (2认同)
  • 函数上的'static'仅影响链接:函数获取内部链接,只能从定义它的同一文件访问.这使得可以在多个文件中定义名为"f"的静态函数.如果您尝试使用非静态函数执行此操作,链接器将抱怨符号"f"的多个定义. (2认同)

bit*_*its 10

静态变量根本没有存储在Heap中.

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

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

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