也許類似的東西已經被問過了,當然,這是一個挑剔......constexpr和初始化
我有一大堆的不斷std::map
S的enum (class)
值及其std::string
表示(雙向)之間進行切換。有人在這裏向我指出,這些映射將在運行時初始化,當其他初始化代碼運行時,在我的程序執行所有好東西之前。這意味着常量表達式會影響運行時性能,因爲映射是從它們的枚舉字符串對構建的。
一個示例是,這裏是這些地圖的一個示例:
enum class os
{
Windows,
Linux,
MacOSX
};
const map<string, os> os_map =
{ {"windows", os::Windows},
{"linux", os::Linux},
{"mac", os::MacOSX} };
const map<os, string> os_map_inverse =
{ {os::Windows, "windows"},
{os::Linux, "linux"},
{os::MacOSX, "mac"} };
請問C++ 11 constexpr
對性能有任何影響,或者是我的一個運行時初始化處罰的前提假的?我認爲編譯器可以將一個常量STL容器作爲純數據嵌入到可執行文件中,但顯然這可能不像我聲音那樣容易?
爲什麼不你嘗試'boost :: bimap'來枚舉枚舉和它的字符串表示之間的雙向映射嗎?添加新值時發生錯誤的可能性較小。 – Xeo
Xeo:將Boost拉進一件簡單的事情?不,謝謝,我沒有依賴關係,並且真的想保持這種方式;)...我甚至可以用'unordered_map'替換string-> enum map,並用enum替換enum-> string map 「(枚舉值並不重要,它們只是一個接一個地計算),如果這樣可以改善性能的話。 'boost :: bimap'會吸收比較:) – rubenvb
@rubenvb:然而[Boost.MultiIndex](http://www.boost.org/libs/multi_index/)可以做到這一點,更簡潔,0高架。請不要將Boost視爲「依賴」。 – ildjarn