С дополнительным кодом, который вы разместили, и ответом Джонатана Уэйкли на конкретную проблему с вашим компилятором, я могу высказать предположение.
При написании собственного кода, по возможности, я предпочитаю генерировать простые старые данные иоставляя логику и поведение в не сгенерированном коде.Таким образом, вы получите небольшой (er) чистый код C ++ в стиле управляемых данными, а также отдельный блок глупых и легко генерируемых данных в декларативном стиле.
Например, непосредственно кодируйте этот
// GeneratedData.h
namespace GeneratedData {
struct Element {
const char *type;
const char *key;
const char *val;
};
Element const *rawElements();
size_t rawElementCount();
}
и это
// main.cpp
#include "GeneratedData.h"
#include <string>
#include <unordered_map>
using Map = std::unordered_map<std::string, std::string>;
using TypeMap = std::unordered_map<std::string, Map>;
TypeMap buildMap(GeneratedData::Element const *el, size_t count)
{
TypeMap map;
for (; count; ++el, --count) {
// build the whole thing here
}
}
// rest of main can call buildMap once, and keep the big map.
// NB. don't pass it around by value!
и, наконец, сгенерируйте большой тупой файл
// GeneratedData.cpp
#include "GeneratedData.h"
namespace {
GeneratedData::Element const array[] = {
// generated elements here
};
}
namespace GeneratedData {
Element const *rawElements { return array; }
size_t rawElementCount() { return sizeof(array)/sizeof(array[0]); }
}
, если вы действительно хотите, вы можете отделить даже этологика из вашего codegen просто #include
в середине, но это, вероятно, не нужно здесь.
Оригинальный ответ
CMAKE
CMake.
... время компиляции
CMake настраивает систему сборки, которая затем вызывает ваш компилятор.Вы не сказали нам, какую систему сборки она настраивает для вас, но вы, вероятно, могли бы запустить ее вручную для проблемного объектного файла (ов) и посмотреть, сколько на самом деле накладных расходов у CMake.
... пропорционально числу выполнений или строк кода?
Нет.
Существуют некоторые накладные расходы на выполнение.Каждый выполняемый процесс компилятора имеет некоторые издержки на строку кода, но, вероятно, гораздо больше накладных расходов на включенную оптимизацию, и некоторые оптимизации могут масштабироваться с цикломатической сложностью или другими метриками.
статически инициализирует unordered_map unoredred_maps с ~ 20 000Всего пар ключ-значение
Вы должны попытаться как можно больше скрыть свою гигантскую инициализацию - вы не показали никакого кода, но если он виден только в одной единице перевода, только один объектный файл будеткомпиляция займет очень много времени.
Вы также можете использовать инструмент codegen, такой как gperf , для создания идеального хэша.
Я не могу дать вам многобольше деталей, не видя хотя бы фрагмента вашего фактического кода и некоторого намека на то, как расположены ваши файлы и единицы перевода.