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你很清楚自己在做什么.
bit*_*its 10
静态变量根本没有存储在Heap中.
未初始化的静态变量存储在BSS段中.
初始化的静态变量存储在数据段中.
你可以阅读这篇文章,它以一种很好的方式解释了所有这些:http: //duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory