在我們的項目中,我們使用了外部RAM。當通常調用構造函數時,它在啓動時不會被初始化或安全使用。由於這個原因,當一個類需要在外部RAM中實例化時,構造器需要被阻止運行,直到外部RAM準備好使用。這樣做的最好方法是什麼?推遲C++中的靜態變量構造
我能想到的一個選擇是爲具有正確大小和對齊方式的對象分配一些空間,然後在此位置上調用新放置位置。
static ALTRAM union
{
UINT64 alignment;
UINT8 space[sizeof(ClassName)]
}spaceHolder;
ClassName* classInstance = NULL;
...
classInstance new (&spaceHolder) ClassName();
建議的另一個選項是將對象實例化爲傳遞指向實例的指針的函數中的靜態函數對象。我的關注點在於,標準允許在第一次調用函數時調用構造函數,但似乎並不需要所有編譯器都這樣做。 See bold text from the standard。
static ClassName& GetInstance()
{
static ALTRAM ClassName instance;
return instance;
}
該項目針對Win32 VC++和Keil for ARM進行編譯,但僅對ARM有此要求。是否有編譯指示或其他方法來防止構造函數被調用?
我正在尋找不需要修改類的解決方案。
更新
謝謝大家對您的回覆也非常有幫助。我得出以下結論:
- 體系結構應該在應用程序運行之前初始化硬件。這個問題引發了很多關於我們團隊的討論,它很可能會被修復。
- 有些人更喜歡安置新方法。
- 對於另一種方法,C++標準要求在第一次執行函數時調用構造函數,所以這應該是可靠和便攜的解決方案。
放置新方法有什麼問題? – Barmar
操作系統的工作在準備好之前不應該使用這個內存嗎?你不應該在操作系統級別而不是應用級別上解決這個問題嗎? –
@JesperJuhl是的,操作系統級別的解決方案正在調查中,但還沒有。 – colojaro