Компиляция с ограничением виртуальной памяти в g++ 4.7.1?

Я компилирую некоторый код, который активно использует шаблоны (он основан на фреймворке boost::msm). При компиляции с g++ 4.7.1 процесс cc1plus достигает около 2,4 ГБ объема ОЗУ, а затем завершается с ошибкой "Исчерпана виртуальная память: невозможно выделить память".

Я использую 32-битный компилятор (переключение на 64-битную версию не является опцией ATM), сама машина представляет собой 64-битную Ubuntu с 16 ГБ ОЗУ, компиляция выполняется под 64-битным chroot дистрибутива Debian wheezy. Во время компиляции доступно много оперативной памяти, поэтому, если компиляция не удалась из-за нехватки физически доступной оперативной памяти, она должна сначала достичь 4 ГБ. Я попытался поиграть с опциями "ulimit -m", установив другие значения и установив его на меньшие размеры, что приводит к сбою компилятора раньше, но если оставить его равным "unlimited", он потерпит неудачу при вышеупомянутых 2+ Gb.

Так что, думаю, что-то еще должно ограничивать меня. Может быть, кто-то сталкивался с подобной проблемой и знает способ изменить ограничение?

1 ответ

Решение

В 32-разрядных приложениях (включая компиляторы) вы обычно получаете от 2 до 3 ГБ, доступных для пользовательского режима в виртуальном пространстве. Это вызвано сочетанием резервирования пространства памяти и фрагментации пространства памяти (имеется доступная виртуальная память, но недостаточно большой блок для хранения блока любого размера, который new или же malloc запрашивает) и "резервирование памяти", где процесс выделил довольно большой кусок памяти, но на самом деле он не использует все это, поэтому он не "заполнен".

По какой-то конкретной причине вы не можете использовать 64-битный GCC для генерации 32-битного кода - используя -M32? Это было бы моим решением.

Другие вопросы по тегам