Скомпилированные исполняемые файлы C ++ ОГРОМНЫЕ? - PullRequest
5 голосов
/ 14 ноября 2010

Поработав некоторое время на C, я решил наконец начать изучать C ++. Это меня как-то беспокоит, так как стандартный «привет мир» в C обычно составляет ~ 16 КБ, включая весь сырой компилятор. (С использованием stdio)

Однако, когда я создаю исполняемый файл C ++, делающий привет, размер файла составляет ~ 470 КБ! Я пошел дальше и использовал cstdio вместо iostream, думая, что это будет иметь значение, и это имело место.

Мой вопрос: Когда я включаю iostream, почему размер моего исполняемого файла взрывается?

Редактировать: я использую G ++ (с IDE Dev-CPP, но я могу выяснить, как добавить параметры CL)

Ответы [ 6 ]

7 голосов
/ 14 ноября 2010

Поскольку вы перетащили большую часть стандартной библиотеки с помощью iostreams. Но это одна вещь, поэтому, поскольку ваши программы становятся больше, это будет все меньше и меньше накладных расходов.

Однако вы, вероятно, захотите скомпилировать, используя версию стандартной библиотеки с общей библиотекой, и большинство компиляторов / операционных систем позволят вам сделать это, поэтому вам не придется включать всю стандартную библиотеку в ваш исполняемый файл. Какой компилятор вы используете, и мы, вероятно, посоветуем, как это сделать.

В окнах с командной строкой VC, например, используйте параметр командной строки / MD.

6 голосов
/ 14 ноября 2010

Одним словом, символы .

Стандартная библиотека C ++ вводит в вашу программу lot символов, так как большая часть библиотеки существует в основном в заголовкефайлы.

Перекомпилируйте вашу программу в режиме выпуска и без символов отладки, и вы можете легко ожидать, что программа будет значительно меньше.(Еще меньше, если вы удалите символы.)

В качестве быстрой демонстрации этого факта обратите внимание:

$ cat hello.c
#include <stdio.h>
int main() {
    printf("%s\n", "Hello, world!");
    return 0;
}
$ cat hello.cpp
#include <iostream>
int main() {
    std::cout << "Hello, world!\n";
    return 0;
}
$ gcc hello.c -o hello-c
$ g++ hello.cpp -o hello-cpp
$ gcc hello.c -ggdb -o hello-c-debug
$ g++ hello.cpp -ggdb -o hello-cpp-debug
$ gcc hello.c -s -o hello-c-stripped
$ g++ hello.cpp -s -o hello-cpp-stripped
$ gcc hello.c -s -O3 -o hello-c-stripped-opt
$ g++ hello.cpp -s -O3 -o hello-cpp-stripped-opt
$ ls -gG hello*
-rwxr-xr-x 1  6483 Nov 14 15:39 hello-c*
-rw-r--r-- 1    79 Nov 14 15:38 hello.c
-rwxr-xr-x 1  7859 Nov 14 15:40 hello-c-debug*
-rwxr-xr-x 1  7690 Nov 14 15:39 hello-cpp*
-rw-r--r-- 1    79 Nov 14 15:38 hello.cpp
-rwxr-xr-x 1 19730 Nov 14 15:40 hello-cpp-debug*
-rwxr-xr-x 1  5000 Nov 14 15:45 hello-cpp-stripped*
-rwxr-xr-x 1  4960 Nov 14 15:41 hello-cpp-stripped-opt*
-rwxr-xr-x 1  4216 Nov 14 15:45 hello-c-stripped*
-rwxr-xr-x 1  4224 Nov 14 15:41 hello-c-stripped-opt*

Я не могу объяснить, почему сборка Windows программ с G ++ производит такиебольшие исполняемые файлы, но на любой другой платформе символы являются основным движущим фактором при больших размерах файлов.В настоящее время у меня нет доступа к системе Windows, поэтому я не могу проверить.

2 голосов
/ 14 ноября 2010

Это скорее артефакт компилятора (и опций), который вы используете, чем почти все остальное. В MS VC ++, в зависимости от используемых мной флагов компилятора, я могу получить от ~ 8K до ~ 110K. Используя MinGW, я получаю около 24-25K (опять же, в зависимости от флагов).

На случай, если вам интересно, я бы предположил, что больший диапазон, который я получаю с VC ++, равен , в основном , в результате лучшего знания его флагов. MinGW может охватывать только меньший диапазон, даже если бы я знал его лучше, но из-за моего ограниченного знания его флагов я принимаю большую часть того, что он делает по умолчанию; Я знаю, как включать и выключать оптимизацию, но нужно смотреть на вещи очень внимательно, чтобы сделать намного больше.

2 голосов
/ 14 ноября 2010

Я бы предположил, что при включении <iostream> вы косвенно включаете многие части STL, такие как <string>, который, в свою очередь, включает <vector> и т. Д.

1 голос
/ 15 ноября 2010

Это один из аспектов поддельного интервью на С ++ , которое на самом деле отчасти верно:)

Знаете, когда у нас был первый компилятор C ++ в AT & T, я скомпилировал «Hello World» и не мог поверить в размер исполняемого файла. 2.1MB

Что? Ну, с тех пор компиляторы прошли долгий путь.

Они имеют? Попробуйте это в последней версии g ++ - вы не получите больших изменений из половины мегабайта.

1 голос
/ 14 ноября 2010

MinGW (g ++) компилирует действительно большие файлы.
Например, та же самая программа "hello world" с iostreams компилируется в ~ 100 КБ с помощью VC ++ (со статически связанным CRT) и в ~ 470 КБ с помощью g ++.

...