繁体   English   中英

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

[英]When is memory allotted to static variables in C++

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

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

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

非常感谢 !

第一:停止思考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你很清楚自己在做什么。

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

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

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

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

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

我不知道第二个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM