Я использую версию 5.4.0 и самая простая программа (пустой экран) имеет почти один мегабайт.
Например, после компиляции эта простая программа имеет размер 1 276 КБ. Но удаление #include делает файл очень маленьким: 27 КБ.
#include<iostream>
using namespace std;
int sum(int a){
if(a>1)
return sum(a-1)+a;
else
return 1;
}
int main(){
int a=1;
while(a>=0){
cout<<"a = ";
cin>>a;
cout<<"1+...+a = "<<sum(a)<<endl;
}
return(0);
}
Мне кажется, что должно быть возможно сгенерировать намного меньший исполняемый файл для вышеупомянутого. Как мне добиться этого?
Вот несколько идей из моего опыта:
Просмотрите весь исходный код и удалите неиспользуемый код, как неиспользуемые функции, так и блоки операторов, которые не будут выполнены. Используйте статический анализатор кода, чтобы помочь найти их.
Не использовать printf
если не нужно.
В нем много кода, особенно для форматирования чисел с плавающей запятой.
Ваш компилятор выводит неиспользуемые функции из библиотечных файлов?
Некоторые компиляторы ссылаются на весь файл библиотеки, а не только на функции, используемые в нем.
Вы измеряете отладку (с символами) или выпуск (без символов)?
Вы измеряете версию статической библиотеки или только код без динамических библиотек?
Просмотрите все встроенные функции.
Преобразуйте большие встроенные функции в не встроенные.
Удалите общий код из шаблонов и функций.
Уменьшите количество статически и глобально инициализированных переменных.
Инициализация занимает место в вашем исполняемом файле.
Объявите постоянные переменные как static const
где это возможно.
Поместите обычные текстовые литералы в один файл и возвращайте ссылки или постоянные указатели на них.
Это поможет компилятору объединить дубликаты строк в разных модулях.
Анализируйте функции для общих фрагментов кода. Разделите их на отдельные функции или методы.
Переместите некоторые функции в динамические библиотеки. Пусть ОС определит, когда использовать код.
Удалите весь код, относящийся к будущим функциям, которые в данный момент не выполняются.
Данные занимают место в вашем исполняемом файле, особенно значения, используемые для инициализации статических или глобальных переменных. Рассмотрите возможность перемещения данных в файл и загрузки данных по требованию.
Некоторые из этих предложений уменьшат ваш исполняемый файл, но не приложение, например файлы данных и динамические библиотеки. Они будут необходимы для выполнения вашей программы, но могут не понадобиться в исполняемом файле.
Некоторые предложения снизят производительность вашего приложения. Извините, это время / память обмен: вы можете сэкономить память, но это займет больше времени выполнения (например, поля упаковки).
Других решений пока нет …