簡體   English   中英

C++靜態POD初始化

[英]c++ static POD initialization

我有一個簡單的 POD 實例

一個.hpp

class A {
    struct Zzz {
        A*  m_aPtr;
        int m_val;
    }

    static Zzz s_zzz;
};

a.cpp

A::Zzz A::s_zzz;

我希望 s_zzz.m_aPtr 和 s_zzz.m_val 都將在任何其他編譯單元中的任何其他靜態初始化之前初始化為零,並且由語言本身保證。 我是對的嗎?

通常我為結構提供默認構造函數。

A::Zzz::Zzz() :
 m_aPtr(0),
 m_val(0)
{
}

它會產生初始化順序問題還是引入編譯器依賴性?

至少在 C++0x 中,您可以依賴在任何其他初始化代碼運行之前執行的所有零初始化

來自 C++0x FCD,部分[basic.start.init]

具有靜態存儲持續時間 (3.7.1) 或線程存儲持續時間 (3.7.2) 的變量應在任何其他初始化發生之前進行零初始化 (8.5)。

如果您正在考慮從其他初始化代碼使用此變量,那么顯式構造函數將是一個大錯誤,因為它有時會與其他初始化代碼混合運行,並覆蓋其他初始化程序已經進行的任何更改。

我希望 s_zzz.m_aPtr 和 s_zzz.m_val 都將在任何其他編譯單元中的任何其他靜態初始化之前初始化為零,並且由語言本身保證。

它將被零初始化,因為它是命名空間范圍內的靜態生命周期變量。

零初始化發生在任何動態初始化之前(動態初始化的一個例子是當您進行一些顯式初始化或類具有構造函數時)。

不同翻譯單元之間的零初始化順序沒有定義,但沒有任何方法可以檢測或依賴它,因為它發生在其他任何事情之前,所以這無關緊要。

關於你的第 2 點,目前還不清楚你在問什么。

但是對於你的靜態生命周期對象,效果只是它首先被初始化為零,然后在動態初始化期間你的構造函數被用來再次將它歸零(盡管編譯器可能足夠聰明,可以優化掉多余的額外初始化)。

干杯 & hth.,

勘誤表:Ben Voigt 提供了一個令人信服的例子,說明上面最后一段是錯誤的 所以請無視。 構造函數的存在意味着對象可以在改變它的操作之前、之間或之后的某個時刻動態初始化,從而導致相當不可預測的結果......

  1. 編譯單元之間的靜態初始化順序無法保證(參見http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14 )。

  2. 不幸的是,如果它有一個構造函數,它將不再是一個 POD。

  1. 靜態數據始終初始化為零。
  2. 不,它不應該引入任何初始化問題。

當應用程序加載到內存中時,靜態區域被初始化為零。 這是在任何代碼開始執行之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM