靜態初始化--我的理解 (轉)
首先要明確的是,所有的初始化都是執行時完成的。
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_;
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()中).
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990312/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深入理解Java中靜態初始化塊、初始化塊和構造方法Java構造方法
- 理解 TypeScript 的靜態型別TypeScript型別
- static靜態變數的理解變數
- 靜態代理、動態代理與Mybatis的理解MyBatis
- 代理模式-靜態代理解讀模式
- 理解靜態繫結與動態繫結
- 輕鬆理解 Java 靜態代理/動態代理Java
- 區分oracle的初始化引數為靜態還是動態Oracle
- Java初始化靜態變數的時間順序Java變數
- C++類的靜態成員變數初始化C++變數
- 區域性靜態變數的初始化觀測變數
- 對 PHP 後期靜態繫結的理解PHP
- 動態繫結和靜態繫結的簡單理解
- 動態和靜態監聽註冊-小魚的理解
- 深入理解靜態代理與JDK動態代理JDK
- DEDE整站動態/靜態轉換
- Delphi 類的靜態屬性 (轉)
- Java 靜態代理和動態代理的使用及原理解析Java
- 小白學PyTorch 動態圖與靜態圖的淺顯理解PyTorch
- 深入理解 C++ 的動態繫結和靜態繫結C++
- 偽靜態、靜態和動態的區別
- Delphi系列談之:Delphi中的靜態屬性及靜態方法的實現 (轉)
- C++ 靜態變數什麼時候完成初始化C++變數
- java中靜態初始化塊,例項初始化塊,建構函式區別Java函式
- linux靜態庫的生成與使用(轉)Linux
- 深入理解C語言----動態庫 & 靜態庫 & 連結C語言
- 靜態轉移預測技術
- VBA靜態變數與常量(轉)變數
- 域初始化、靜態塊及構造方法等在建立類例項時的執行順序 (轉)構造方法
- 轉載:oracle監聽器的靜態和動態註冊Oracle
- 避免因在類中使用靜態函式而大量使用靜態變數 (轉)函式變數
- 【譯】Effective TensorFlow Chapter2——理解靜態和動態形狀APT
- 靜態變數與靜態方法變數
- 轉載:我所理解的 PHP TraitPHPAI
- 我的CSS初始化CSS
- Linux 依賴動態庫 / 靜態庫的動態態庫 / 靜態庫Linux
- 靜態地址轉換+埠複用地址轉換
- 理解C#中靜態Static與單例SingletonC#單例