Столкнулся с небольшой проблемой: даже самая маленькая программа из 5ти операторов занимает на диске по 160 кб. Например, написал такой код в Студии 2006:
Код | #include <stdio.h>
int main(){ int x=0; printf("hello world"); scanf("%d",&x); return 0; }
|
После компиляции получил экзешник размером 160 кб. Как мне кажется, в экзешник компилируется вся включаемая библиотека stdio и все библиотеки, которые она подключает директивой include. И вот хочется узнать, можно как-то уменьшить размер кода с помощью ключей компилятора или линкера? Искал в сети примеры такой оптимизации, натолкнулся на скомпилированный небольшой сервер и его исходник. Сам экзешник весит всего 9 кб, никаким пакером, кажется, не упакован. В исходнике был такой заголовок:
Код | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [ INCLUDE'S ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \\
#include <winsock2.h> #include <stdio.h>
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [ PRAGMA'S ] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \\
#pragma comment( lib, "ws2_32.lib" ) #pragma comment( lib, "kernel32.lib" ) #pragma comment( lib, "user32.lib" )
#pragma optimize("gsy",on) #pragma comment(linker,"/RELEASE") #pragma comment(linker,"/NOLOGO") #pragma comment(linker,"/NODEFAULTLIB") #pragma comment(linker,"/MERGE:.rdata=.text /MERGE:.data=.text") #pragma comment(linker,"/SECTION:.text,EWR") #pragma comment(linker,"/FILEALIGN:512") #pragma comment(linker,"/SUBSYSTEM:CONSOLE") #pragma comment(linker,"/IGNORE:4078") #pragma comment(linker,"/ENTRY:main")
|
И в статье, где была ссылка на этот пример, было описание методов оптимизации через pragma. Но даже скопировав этот заголовок в свою программу, я не только не уменьшил ее размер, но еще и увеличил ее на 40 кб. К тому же программа не хотела компилироваться, пока я не вырезал #pragma comment(linker,"/NODEFAULTLIB"). Пакеры использовать не хочу, потому что они чаще всего сжимают только размер исполняемого файла, а в оперативке программа разворачивается во весь свой размер. Можно как-то самому уменьшить размер генерируемого кода средствами Студии, чтобы приблизиться к размеру ассемблерных программ? |