这是我必须使用的常见代码模式:
class foo {
public:
void InitMap();
void InvokeMethodsInMap();
static void abcMethod();
static void defMethod();
private:
typedef std::map<const char*, pMethod> TMyMap;
TMyMap m_MyMap;
}
void
foo::InitMap()
{
m_MyMap["abc"] = &foo::abcMethod;
m_MyMap["def"] = &foo::defMethod;
}
void
foo::InvokeMethodsInMap()
{
for (TMyMap::const_iterator it = m_MyMap.begin();
it != m_MyMap.end(); it++)
{
(*it->second)(it->first);
}
}
但是,我发现处理映射的顺序(在 for 循环中)可能会因构建配置是 Release 还是 Debug 而有所不同。似乎发布版本中发生的编译器优化会影响此顺序。
我认为通过begin()
在上面的循环中使用,并在每次方法调用后递增迭代器,它将按初始化顺序处理映射。但是,我还记得读过地图是作为哈希表实现的,并且无法保证顺序。
这特别烦人,因为大多数单元测试都是在 Debug 构建上运行的,并且通常在外部 QA 团队开始测试之前不会发现奇怪的顺序依赖错误(因为他们使用的是 Release 构建)。
谁能解释这种奇怪的行为?