Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Уменьшение размера исполняемого кода 
:(
    Опции темы
Dаedra
Дата 18.5.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 20.2.2009

Репутация: нет
Всего: нет



Столкнулся с небольшой проблемой: даже самая маленькая программа из 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").
Пакеры использовать не хочу, потому что они чаще всего сжимают только размер исполняемого файла, а в оперативке программа разворачивается во весь свой размер. Можно как-то самому уменьшить размер генерируемого кода средствами Студии, чтобы приблизиться к размеру ассемблерных программ?
PM MAIL   Вверх
GoldFinch
Дата 18.5.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



достаточно #pragma comment(linker,"/entry:main")
PM MAIL ICQ   Вверх
SenkraD
Дата 18.5.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



Dаedra, ещё можно подменить CRT.
Мне в своё время помогла эта версия CRT


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Dаedra
Дата 18.5.2009, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 20.2.2009

Репутация: нет
Всего: нет



Цитата

достаточно #pragma comment(linker,"/entry:main")

у меня после этого программа стала рушиться через секунду после запуска, но её объем так и не уменьшился
PM MAIL   Вверх
Dаedra
Дата 18.5.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 20.2.2009

Репутация: нет
Всего: нет



Кстати, может, я что-то не так делаю, но я скачал WCRT, файл wcrt.lib кинул к другим либам, в папке хедеров создал папку wcrt и в нее скинул все хедеры библиотеки wcrt, в программе подключил stdio так:
Код

#include <wcrt/stdio.h>

 то есть, хедеры находятся относительно стандартной папки так: Include/wcrt/stdio.h, но размер так и не уменьшился. может, что-то еще нужно сделать?
PM MAIL   Вверх
GoldFinch
Дата 18.5.2009, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(Dаedra @  18.5.2009,  21:41 Найти цитируемый пост)
у меня после этого программа стала рушиться через секунду после запуска, но её объем так и не уменьшился 

при использованни этой строчки нельзя юзать CRT
PM MAIL ICQ   Вверх
math64
Дата 19.5.2009, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Может лучше выбрать другой компилятор? Например gcc.
PM   Вверх
SenkraD
Дата 19.5.2009, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



Dаedra, wcrt используем так:
    - говорил линкеру, что мы её используем
    - говорим что мы игнорим стандартную crt


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Echo78
Дата 27.6.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Цитата(math64 @ 19.5.2009,  07:48)
Может лучше выбрать другой компилятор? Например gcc.

Это было одной из причин, по которой я выбрал gcc, теперь в нём и работаю.  smile 
В нём размер exe-файла после strip становится маленьким... 
PM MAIL   Вверх
DrHex
Дата 29.6.2009, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 2.5.2009

Репутация: нет
Всего: нет



Цитата

достаточно #pragma comment(linker,"/entry:main")

А ресурсы ручками прикручивать? Так а смысл? Размер не особо уменьшится.
Если не хочется заниматся формированием исполняемого файла вручную, то просто упаковывай файл
Упаковщики UPX, Aspack, PeCompact(Это не реклама, UPX открый для использования и работает на многих ОС) ..... 

--------------------
google.com и это все.
PM MAIL   Вверх
chaos
Дата 29.6.2009, 06:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Dаedra, чот сказки какие-то
специально залез на машину на которой стоит VS2003 - на ней ваш пример собирается в ехе размером 44к релизная версия.

ЗЫ да и вообще считаю рано вы смотрите на размер бинарника
PM WWW   Вверх
chaos
Дата 29.6.2009, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Цитата(math64 @ 19.5.2009,  04:48)
Может лучше выбрать другой компилятор? Например gcc.

с другим компилятором мы нормально сможем компилять под винду?

ЗЫ например COM server
PM WWW   Вверх
andrew_121
Дата 29.6.2009, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



chaos,  smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Lazin
Дата 29.6.2009, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(chaos @  29.6.2009,  07:15 Найти цитируемый пост)
с другим компилятором мы нормально сможем компилять под винду?

ЗЫ например COM server

сильно сомневаюсь, лучше для этого использовать visual studio
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 29.6.2009, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(DrHex @  29.6.2009,  01:04 Найти цитируемый пост)
достаточно #pragma comment(linker,"/entry:main")

А ресурсы ручками прикручивать? Так а смысл? Размер не особо уменьшится.


а при чем тут ресурсы и точка входа? размер уменьшается как раз на размер CRT, до единиц килобайт
получается 0x400 байт на заголовок, выравнивание 0х200*(число секций) , а остальное - сколько кода напишешь - столько и будет
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0875 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.