2010-11-14 3 views
5

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

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

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

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

+0

Я хотел бы указать, что Dev-C++ поставляется с * очень старой версией GCC. Подумайте о переходе на wxDev-C++ или Code :: Blocks, оба из которых более современны. – greyfade

ответ

6

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

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

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

В быстрой демонстрации этого факта, наблюдения:

$ 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, поэтому я не могу проверить.

+1

+1! Вы можете найти ** лот ** отладочных символов в STL. – jwueller

+0

Привет, спасибо, что нашли время, чтобы сделать результаты. Я сделал это в окнах, используя флаги «-s -O3», а размер файла уменьшен с 475 до 263 кбайт. Это помогает, но я могу сделать больше? – Saustin

+1

@Saustin: используйте новый компилятор. Вы используете один, который очень * старый. Вероятно, это происходит с некоторым количеством трещин, которые не попадают в новые версии. Dev-C++ все равно не поддерживается, поэтому нет смысла продолжать использовать его, когда есть так много других, лучших вариантов. Я имею в виду, что последний релиз был в 2005 году! – greyfade

7

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

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

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

+0

Я использую G ++ w \ Dev-CPP. – Saustin

2

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

+0

Чтобы поставить этот ответ на C-терминах, это разница между использованием putc vs. printf. В коде printf есть много функциональных возможностей, которые (относительно) ловят ваш исполняемый файл C по сравнению с простой функцией putc. Для ситуации Сауина методы «огромны» относительно printf, а STL «огромна» относительно . – franji1

2

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

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

1

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

+0

Это по-прежнему относится к новейшей Visual Studio и MinGW w-64 с GCC 7.2.0 (со стандартными флагами компилятора, которые использует CMake для сборки Release). – clocktown

1

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

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

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

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

+1

Не очень полезно, но помогает какой-то юмор. – Saustin

 Смежные вопросы

  • Нет связанных вопросов^_^