也许类似的东西已经被问过了,当然,这是一个挑剔......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