說我有一個對象,每個程序運行需要大約30秒的時間來構造。每次程序運行時,該對象都由相同的數據構成。該問題存在哪些解決方案?在編譯時構造對象並存儲在可執行文件中?
編輯:
我沒有適合我的問題的一個更具體的版本,一些研究。特別是,我想用一些值填充散列表。我找到http://www.gnu.org/software/gperf/這解決了這個確切的問題。 gperf生成一個完美的散列函數和相關的表。
說我有一個對象,每個程序運行需要大約30秒的時間來構造。每次程序運行時,該對象都由相同的數據構成。該問題存在哪些解決方案?在編譯時構造對象並存儲在可執行文件中?
編輯:
我沒有適合我的問題的一個更具體的版本,一些研究。特別是,我想用一些值填充散列表。我找到http://www.gnu.org/software/gperf/這解決了這個確切的問題。 gperf生成一個完美的散列函數和相關的表。
C++ 11引入了「常量表達式」,它可以通過將constexpr
關鍵字的裝置上的對象賦予的擴展概念:
constexpr int a = 12; // constant expression
constexpr int f(int n) { return a * n; }
constexpr int b = f(a); // also constant expression
對象可以具有構造聲明爲constexpr
爲好。函數限定爲常量表達式的規則是非常嚴格的,但是如果您能夠構建這樣的對象,那麼可以在編譯時計算並存儲常量表達式的全局對象。它們算作「靜態初始化」(基本上,在程序啓動之前初始化了)。
此前C++ 11中,僅最簡單的原語類型進行資格這種治療。
凡是需要動態分配永遠是常量表達式,所以沒有像其在全球std::map
靜態初始化任何的希望。
您的問題沒有通用的解決方案。您需要分析您的對象以確定在30秒內創建的內容,並找到一些方法來表示特定數據,而無需進行大量計算。
一旦你瞭解如何重現具體的數據沒有計算,你可以輕鬆地序列化出來給你喜歡的任何存儲(包括臨時存儲,到後來被添加到您的編譯對象)。從那裏,將它反序列化回你的對象應該不是一件困難的事情。
這是假設,當然,還有你的對象沒有使用動態資源(打開文件,插座,內存分配等)。你不能序列化。
考慮對象如何表示的另一種方式。例如,如果它是您生成的多層圖像,則可能只需加載完全合成的圖像,而不是每次運行時生成它。
聲明該對象爲const? –
的可能重複:http://stackoverflow.com/questions/12453623/can-i-get-ac-compiler-to-instantiate-objects-at-compile-time – Borgleader
是施工過程中你的對象做任何與外部世界?我的意思是打開套接字,文件,創建信號量,創建和顯示窗口...? – PiotrNycz