У меня есть автоматически сгенерированный исходный файл C ++, размером около 40 МБ. Он в основном состоит из команд push_back для некоторых векторов и строковых констант, которые должны быть выдвинуты.
Когда я пытаюсь скомпилировать этот файл, g ++ завершает работу и говорит, что не может зарезервировать достаточно виртуальной памяти (около 3 ГБ). Погуглив эту проблему, я обнаружил, что с помощью командной строки переключается
--param ggc-min-expand=0 --param ggc-min-heapsize=4096
может решить проблему. Однако они, похоже, работают только при включенной оптимизации.
1) Это действительно то решение, которое я ищу?
2) Или есть более быстрый, лучший (компиляция занимает много времени с этими опциями)?
С наилучшими пожеланиями,
Александр
Обновление: Спасибо за все хорошие идеи. Я попробовал большинство из них. Использование массива вместо нескольких операций push_back () уменьшило использование памяти, но, поскольку файл, который я пытался скомпилировать, был настолько большим, он все же потерпел крах, только позже. В некотором смысле, это поведение действительно интересно, так как в таких условиях оптимизировать особо нечего - что делает GCC за кулисами, который стоит так много памяти? (Я также скомпилировал с деактивацией всех оптимизаций и получил те же результаты)
Решением, на которое я переключился, является чтение исходных данных из двоичного объектного файла, который я создал из исходного файла с использованием objcopy
. Это то, что я изначально не хотел делать, потому что создание структур данных на языке более высокого уровня (в данном случае Perl) было удобнее, чем делать это в C ++.
Однако запустить его под Win32 оказалось сложнее, чем ожидалось. Кажется, что objcopy генерирует файлы в формате ELF, и кажется, что некоторые проблемы исчезли, когда я вручную установил формат вывода на pe-i386
. Символы в объектном файле по стандарту названы в честь имени файла, например, преобразование файла inbuilt_training_data.bin
приведет к получению следующих двух символов: binary_inbuilt_training_data_bin_start и binary_inbuilt_training_data_bin_end. Я нашел в Интернете несколько учебных пособий, в которых утверждается, что эти символы должны быть объявлены как extern char _binary_inbuilt_training_data_bin_start;
, но, похоже, это неверно - у меня сработал только extern char binary_inbuilt_training_data_bin_start;
.