2012-09-21 44 views
0

說我有一個對象,每個程序運行需要大約30秒的時間來構造。每次程序運行時,該對象都由相同的數據構成。該問題存在哪些解決方案?在編譯時構造對象並存儲在可執行文件中?

編輯:

我沒有適合我的問題的一個更具體的版本,一些研究。特別是,我想用一些值填充散列表。我找到http://www.gnu.org/software/gperf/這解決了這個確切的問題。 gperf生成一個完美的散列函數和相關的表。

+0

聲明該對象爲const? –

+0

的可能重複:http://stackoverflow.com/questions/12453623/can-i-get-ac-compiler-to-instantiate-objects-at-compile-time – Borgleader

+0

是施工過程中你的對象做任何與外部世界?我的意思是打開套接字,文件,創建信號量,創建和顯示窗口...? – PiotrNycz

回答

2

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靜態初始化任何的希望。

+0

我在想一個地圖。我想我必須實現一些狡猾的東西。 – flumpb

+0

@kisplit:你當然可以製作自己的constexpr二進制​​搜索樹...因爲它是不變的,你不需要任何重新平衡算法,所以這實際上很簡單... –

+0

這聽起來非常有趣,我會給它是一個嘗試。謝謝(你的)信息! – flumpb

1

您的問題沒有通用的解決方案。您需要分析您的對象以確定在30秒內創建的內容,並找到一些方法來表示特定數據,而無需進行大量計算。

一旦你瞭解如何重現具體的數據沒有計算,你可以輕鬆地序列化出來給你喜歡的任何存儲(包括臨時存儲,到後來被添加到您的編譯對象)。從那裏,將它反序列化回你的對象應該不是一件困難的事情。

這是假設,當然,還有你的對象沒有使用動態資源(打開文件,插座,內存分配等)。你不能序列化。

1

考慮對象如何表示的另一種方式。例如,如果它是您生成的多層圖像,則可能只需加載完全合成的圖像,而不是每次運行時生成它。