Для проекта у меня есть начальный стол, который я решил положить в std::unordered_map
, К сожалению, я ограничен жестким кодированием всей карты. Итак, я решил разделить инициализацию на несколько файлов.
class OpeningBook
{
public:
OpeningBook();
private:
std::unordered_map<std::string, int> opening_database_;
void init1();
void init2();
void init3();
void init4();
void init5();
};
и конструктор просто вызывает init
функции:
OpeningBook::OpeningBook()
{
init1();
init2();
init3();
init4();
init5();
}
Все из которых просто выглядят так:
void OpeningBook::init1()
{
opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000001100000-1-1000",5000));
opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100000-1-1100",5000));
opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100001-1-1000",5000));
opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100000-1-1010",5000));
opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100010-1-1000",5000));
opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100000-1-1001",5000));
opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-100000010000-11-1000",0));
opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-100000010000-10-1100",5000));
// continues
}
Однако, как только мой код попадет в открывающую скобку в init1()
, он генерирует исключение переполнения стека. Я думал, что переполнение стека не может произойти, потому что unordered_map
находится в куче. В чем дело? и что я могу сделать, чтобы это исправить?
Сколько предметов вы вставляете в каждый initx()
метод? Если это много тысяч, то возможно, что компилятор генерирует код, который использует большое количество временных переменных в стеке, и просто запрашивает больше стекового пространства, чем доступно.
Попробуйте разделить ваши методы инициализации и посмотреть, решит ли это проблему.
Лучшим подходом может быть наличие таблицы, содержащей данные инициализации:
static const struct {
const char *str;
int n;
} DatabaseInitData[] = {
{"0001000000-10000001000000-1000001100000-1-1000",5000},
{"0001000000-10000001000000-1000000100000-1-1100",5000},
{"0001000000-10000001000000-1000000100001-1-1000",5000},
// etc
};
Тогда в вашем конструкторе:
OpeningBook::OpeningBook()
{
for (int i = 0; i < sizeof(DatabaseInitData)/sizeof(DatabaseInitData[0]); i++) {
opening_database_.insert(std::pair<std::string, int>(
DatabaseInitData[i].str,
DatabaseInitData[i].n));
}
}
Других решений пока нет …