как может быть такая большая разница в памяти с -static командой компиляции? (C) - PullRequest
0 голосов
/ 09 сентября 2018

Я работаю над задачей для университета, есть веб-сайт, который проверяет использование моей памяти и компилирует файлы .c с:

 /usr/bin/gcc -DEVAL -std=c11 -O2 -pipe -static -s -o program programname.c -lm

и там написано, что моя программа превышает лимит памяти в 4 Mib, что, я думаю, очень много. Мне сказали, что эта команда заставляет ее использовать больше памяти, чем стандартная компиляция, которую я использую на моем компьютере, например:

 gcc myprog.c -o myprog

Я запустил исполняемый файл, созданный этой компиляцией, с:

/usr/bin/time -v ./myprog

и в поле «максимальный размер резидентного набора» указано 1708 килобайт, что должно быть 1,6 Mibs. Так как может быть так, что для университетского контролера моя программа превышает 4 Mibs? Я удалил все возможные вредоносные программы, которые у меня были, я только что оставил основные, но они все еще говорят, что они выходят за рамки, что еще мне улучшить? Я почти думаю, что на сайте есть ошибка или что-то ...

1 Ответ

0 голосов
/ 09 сентября 2018

Из Руководство по GNU GCC , Страница 197:

-static В системах, которые поддерживают динамическое связывание, это переопределяет «-pie» и предотвращает связывание с общими библиотеками. В других системах это опция не имеет никакого эффекта.

Если вы не знаете о флаге pie, указанном здесь, взгляните на этот раздел:

-pie Создать динамически связанный независимый от позиции исполняемый файл для целей, которые его поддерживают. Для предсказуемых результатов вы также должны указать тот же набор параметров, который использовался для компиляции (‘-fpie’, ‘-FPIE’ (или подопции модели) при указании этого параметра компоновщика.

Чтобы ответить на ваш вопрос: да, возможно ли это издержки, сгенерированные статическим флагом, потому что в этом случае компилятор не может выполнить базовую оптимизацию, объединяя код stdlib с тем, который вы создали.

Как было предложено в комментариях, вы должны скомпилировать свой код с тем же флагом веб-сайта, чтобы иметь представление о реальных издержках вашей программы (убедитесь, что ваша версия gcc совпадает с веб-сайтом), а также вы должен выполнить некоторую обычную ручную оптимизацию, такую ​​как постоянное свертывание, встраивание функций и т. д. Хорошей ссылкой на эти оптимизации может быть this

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...