[英]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.