2012-01-10 27 views
2

我很抱歉問這個微不足道的問題,但我找不到明確的答案:如果我有明確的靜態初始化爲零,它是零初始化還是初始化與常量表達式?說,如果我有在C++中顯式靜態初始化爲零

a.hpp:

class A { ... static int x; } 

a.cpp;

int A::x = 0; 

多少次將0分配給x?一次在零初始化期間或兩次在零初始化和恆定表達式初始化期間?

+0

你怎麼能區分? – MSalters 2012-01-10 15:08:48

回答

2

在執行任何代碼之前,變量的值將爲0。 它如何得到這種方式在很大程度上取決於系統;一種典型的方法 是在加載程序時從磁盤讀取日期的圖像。 在形式上,初始化爲零,接着是初始化靜態 ,但是不符合的實現方法無法判斷,我從來沒有聽說過將這兩者分開的實現。

在Unix下,至少在其舊版本和傳統版本中, 未初始化的靜態變量被放置在bs段中, 靜態初始化數據段中的變量。磁盤上的可執行文件 包含數據段的圖像,該圖像被 複製到內存中; bs段中的所有字節都設置爲0. 在具有分頁虛擬內存的現代計算機上,我期望類似的 行爲,不同之處在於初始化將推遲到第一次訪問該頁時的初始值爲 。

如果Windows以不同的方式處理(段名除外),我會感到非常驚訝。

+0

我在問C++,它保證了一個非常具體的初始化順序,問題是關於這個順序的細節。 – zzz777 2012-01-10 14:16:24

+0

我回答說。形式上,它是零初始化,其次是靜態初始化,然後是動態初始化。然而,動態初始化之前發生的事情不能由一致性程序來確定,因此係統所做的任何事情都會導致正確的值。大多數系統都按我所描述的進行。 – 2012-01-10 16:44:01

+0

靜態初始化分兩步執行,我想知道哪些將在這裏使用。 – zzz777 2012-01-10 19:02:38