【发布时间】:2011-12-23 00:53:48
【问题描述】:
也许已经有人问过类似的问题,当然,这是一个挑剔...
我有一堆常量 std::maps 可以在 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:为这么简单的事情引入 Boost?不,谢谢,我没有依赖关系,并且真的很想保持这种状态;)...我什至可以用
unordered_map替换字符串-> 枚举映射,用@987654329 替换枚举->字符串映射@(枚举值并不重要,它们只是一个一个地计数)以提高性能。boost::bimap相比之下会很糟糕:) -
@rubenvb :然而Boost.MultiIndex 可以做到这一点,更简洁,开销为 0。请不要将 Boost 视为“依赖项”。
标签: c++ initialization constants c++11