[英]How does initialization of static (global) objects happen
我試圖弄清楚如何調用全局對象的構造函數。 我知道在使用翻譯單元的任何內容之前都會調用它們,我對此很好。 我試圖找出如何在Linux和Windows(x86和x64)中實現這一目標。
我似乎記得Windows(x86)使用鏈表進行構造和銷毀,但是我無法在這個問題上找到任何資源。
我在相關主題上找到了以下材料,但似乎沒有任何內容可以涵蓋我正在尋找的內容。
和PE文件格式文件。
任何人都可以指出我找到這個信息的正確方向嗎?
萬一你不明白我在這里有代碼來證明。 SourceA.cpp
#include "stdafx.h"
extern bool DoFunctionB();
class MyClassA {
protected:
bool bIsInitialized;
bool bIsBInitialized;
public:
MyClassA () : bIsInitialized(true) {
bIsBInitialized = DoFunctionB();
}
bool IsInitialized() {
return bIsInitialized;
}
};
static MyClassA MyClassGlobal;
bool DoFunctionA() {
return MyClassGlobal.IsInitialized();
}
SourceB.cpp
#include "stdafx.h"
extern bool DoFunctionA();
class MyClassB {
protected:
bool bIsInitialized;
bool bIsAInitialized;
public:
MyClassB () : bIsInitialized(true) {
bIsAInitialized = DoFunctionA();
}
bool IsInitialized() {
return bIsInitialized;
}
};
static MyClassB MyClassGlobal;
bool DoFunctionB() {
return MyClassGlobal.IsInitialized();
}
Main.cpp的
#include "stdafx.h"
extern bool DoFunctionA();
extern bool DoFunctionB();
int _tmain(int argc, _TCHAR* argv[])
{
bool a = DoFunctionA();
bool b = DoFunctionB();
return 0;
}
將這些添加到新的Windows控制台應用程序。 在構造函數和DoFunctionX()代碼中放置斷點。 點擊F11並逐步完成。 您將看到,首先調用的全局初始化程序將在該文件中的靜態對象初始化之前使用其他cpp文件中的DoFunction。
無論你認為標准是什么。 這就是編譯器所做的。 這是你必須要關注的危險。
如果你在構造函數中加強了2個步驟,你會看到我已經告訴你的指針列表。
快樂的編碼。
你認為在使用對象之前必須運行全局構造函數是錯誤的。 我已根據這個假設修正了很多錯誤,但事實並非如此。 不適用於gcc,也不適用於MSVC,abd肯定不適用於XCode。
你可以在gcc中指定一個屬性 ((init_priority(X)))來強制命令,
或msvc的#pragma init_seg({compiler | lib | user |“section-name”[,func-name]})。
使用XCode時,初始化代碼按目標文件傳遞給鏈接器的順序運行。
我不認為有一個標准,如果有,那么很少有人關注它。 由工具創建者決定他們如何跟蹤最初的初始化和何時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.