靜態初始化–我的理解

來源:互聯網
上載者:User

首先要明確的是,所有的初始化都是運行時完成的。

0) int g;
1) int global = rand();
2) const int ci = 5;

3) struct test
4) {
5)  test() : i_(10) {}
6)  int i_;
7) };

8) test global_object;

9) void fun()
10) {
11)  int local;
12)  int local2 = 100;
13) }

14) int main()
15) {
16)  fun();
17)  static int si;
18)  return 0;
19) }

11 行的local是程式運行到fun()函數中,在stack中分配的,local2同樣如此,但它已經初始化為100,有值。
這樣的初始化可以視之為“動態初始化”,只有運行到fun()函數,才會初始化,而對於程式中所有的global,static object( include variable)來說,只要程式開始運行,它們都必須初始化好了,這個過程你是不知道的,你只要知道,無論在你的程式的哪個地方,都可以放心的使用它們,絕不會出現access violation。:),故稱之為“靜態初始化”。

這種資料會放在.exe檔案的三個節中。.data(已經初始化的資料), .rdata(唯讀初始化的資料), .bss(沒有初始化的資料),注意:普通臨時變數是不會出現在EXE檔案中的。由於C++會初始化所有的你沒有初始化的資料為0,如上面的0行,所以只牽涉.data,.rdata兩個節,bss用於C。

如何?靜態初始化,這個問題太過複雜,我也無法做出高深的解釋,簡述如下。

__sys_main()
{
 __sti();
 main()
 __std();
}

__sti()中負責執行靜態初始化,(在本例中是0,1,2行)然後調用你提供的main(),最後__std()為對象調用dtor。這隻是一個思路,並不代表編譯器就這樣實現。

上例中,0行g以0值放入.data,1行global也是以0值(無法在編譯時間求值)放入.data,2 行ci是以值5放入.rdata,8 行global_object是以0值放入.data,真正需要在__sti()出現的是ci和test::test(),其它的在程式運行時,EXE檔案映象中已經是正確的值。

可以看出,在C中是不需要靜態初始化這一過程的,要麼只能是常量(編譯時間求值)(這是C的要求),要麼就沒有初始化。

(為了提高效率,standard C++ 要求,static object的初始化在其所在函數運行時才開始,似乎也成了“動態”,:)
但它的釋放則必須在__std()中).

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.