Вот общий шаблон кода, с которым мне нужно работать:
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. Похоже, что оптимизация компилятора, которая происходит в сборках Release, влияет на этот порядок.
Я думал, что используя begin()
в цикле выше и увеличивая итератор после каждого вызова метода, он будет обрабатывать карту в порядке инициализации. Однако я также помню, что читал, что карта реализована в виде хеш-таблицы, и порядок не может быть гарантирован.
Это особенно раздражает, так как большинство модульных тестов выполняются в сборке Debug, и часто странные ошибки зависимости порядка не обнаруживаются, пока внешняя команда QA не начнет тестирование (потому что они используют сборку Release).
Кто-нибудь может объяснить это странное поведение?