簡體   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