Анатомия C Run-Time, или Как сделать программу немного меньш
От: Виталий Брусенцев www.airbandits.com/
Дата: 19.01.02 21:16
Оценка: 410 (19) +1
Статья :
Анатомия C Run-Time, или Как сделать программу немного меньшего размера
Автор(ы): Виталий Брусенцев
Дата: 19.01.02
Статья посвящена вопросам оптимизации размера выполняемых модулей, генерируемых различными
компиляторами C++ (основное внимание уделено MS Visual С++). С этой целью рассматриваются особенности Библиотеки исполнения C/C++ и ее реализаций, а также процессы компиляции и компоновки приложений. Приведены практические приемы, позволяющие в ряде случаев уменьшить размер приложения до величины 3-4 килобайта.


Авторы :
Виталий Брусенцев

Аннотация :
Статья посвящена вопросам оптимизации размера выполняемых модулей, генерируемых различными
компиляторами C++ (основное внимание уделено MS Visual С++). С этой целью рассматриваются особенности Библиотеки исполнения C/C++ и ее реализаций, а также процессы компиляции и компоновки приложений. Приведены практические приемы, позволяющие в ряде случаев уменьшить размер приложения до величины 3-4 килобайта.
Успехов,
Виталий.
Да вы о чем люди...
От: null  
Дата: 23.04.03 10:55
Оценка:
На самом деле смысл в 5 Kb имеет только если увас очень большой проект с большим количеством маленьких файлов.

Извращаться из-за 3-5Kb это изврат... Все равно она моментом скачается пользователем если важен размер только для этого.
Кое что лишнее
От: abraksas  
Дата: 31.01.03 03:19
Оценка:
Привет все.

До прочтения статьи, я незнал про секретную опцию (/opt:nowin98) поэтому пришлось найти меене секретную (/ALIGN).
и того #pragma comment(linker, "/ALIGN:0x1000 0x200") дает в принципе тотже результат имхо...
А, да, про лишнее то чуть незабыл =)
В ехешнике между dos-stub и PE заголовком есть какаято абра кадабра которую имхо не кто не юзает (я точно), так вот как от нее избавиться то?
если нужен маленький EXE
От: Владимир Гренадеров Россия  
Дата: 03.03.02 18:37
Оценка:
>> Но встречаются случаи, когда считаешь буквально каждый байт исполняемого модуля. Это может >> быть ядро инсталлятора или самораспаковывающегося архива....

Господа, а про ASM вы случайно не зыбыли ?
В случае, если требуется действительно минимальный объем EXE, единственный выход — ASM.
Незачем кастрировать C++ для того, что можно сделать на ассемблере без усилий :)

P.S. А если в PE сделать всего 1 секцию, то и выравнивание значения не имеет :)
OK
По поводу замены функций
От: Dinis Россия  
Дата: 27.01.02 21:16
Оценка:
Получается, что в ядре есть аналоги ко многим функциям CRT. В KB даже есть статья "Win32 Equivalents for C Run-Time Functions" (Article ID: Q99456).
Но если я не могу обойтись без разбора строки функцией sscanf? Получается, что из-за одной функции мне придется использовать CRT? Или извращаться ручками из строки вытаскивать разного типа переменные... вот такой from gates...
Но не забудьте, что такой файл будет медленнее ...
От: ua1zcl Россия www.alexklm.ru
Дата: 22.01.02 23:35
Оценка:
-> Но не забудьте, что такой файл будет медленнее загружаться в память...
Да, 3 кб будет медленее загружаться чем 33 — железная логика (MS)! Я долго смеялся ...
Александр
Что же у Си рантайм такой большой то?
От: Eugene_B  
Дата: 22.01.02 10:21
Оценка:
По поводу "Развлечений"
От: Spark2K Россия  
Дата: 20.01.02 21:16
Оценка:
Все-таки "развлекаться" надо реже :-)
(опечатка: пример test.cpp приведен более одного раза).
Re: Да вы о чем люди...
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.05.03 23:18
Оценка:
Вообще-то CRT в раельных проектах дает не 5 К, а 100 и более К. Ну, а если ДЛЛ-ей много...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: если нужен маленький EXE
От: retalik www.airbandits.com/
Дата: 06.03.02 04:23
Оценка:
У каждого, как известно, свое мнение о предпочтительном инструменте для каждой конкретной задачи. Но тот факт, что С и C++ являются признанными лидерами системного программирования, я думаю, очевиден.
PS: И, как обычно, оптимизировав модуль на C++, можно "довести" его, использовав сгенерированный листинг ASM...
Успехов,
Виталий.
Re: Что же у Си рантайм такой большой то?
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.02.02 12:28
Оценка: :)
А ты с Дельфевыми 300 кило сравни...
с Явными 1.3 мегами, ну и с .Net-овскими 20... :)
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: По поводу замены функций
От: retalik www.airbandits.com/
Дата: 27.01.02 21:33
Оценка:
А чем VariantChangeType не устраивает (для преобразования из строки в число)?
А парсить строку по формату — не такая уж тривиальная операция. За ее наличие "нахаляву" не жалко и 30 Кб заплатить...
Успехов,
Виталий.
Re: Но не забудьте, что такой файл будет медленнее
От: TepMuHyc  
Дата: 27.01.02 07:22
Оценка:
Не железная, а титановая с вольфрамовым армированием. Причем, совершенно справедливая.

Дело в том что операционке (точнее ее дисковой подсистеме) проше и быстрее читать данные с гранулярностью в кластер (те же 4 кила). И это будет справедливо для любой файловой системы и для любой операционки.

А приятно что что один отдел большого мелкософта (компиляторщики) нашел общий язык с другим отделом (операционщиками)...
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
Re: Но не забудьте, что такой файл будет медленнее
От: retalik www.airbandits.com/
Дата: 23.01.02 00:42
Оценка:
Ну, из 30-килобайтного файла 3-килобайт опцией /opt:nowin98 не получишь. Для статического рантайма выигрыш всего-то около 7 килобайт. Чем больше размер EXE, тем меньше относительный выигрыш (и тем большую цену мы платим за размер, проигрывая в скорости загрузки).
Успехов,
Виталий.
Re: Что же у Си рантайм такой большой то?
От: retalik www.airbandits.com/
Дата: 23.01.02 00:39
Оценка:
А у кого он маленький, если у Си большой? :)
Успехов,
Виталий.
Re: По поводу
От: Spark2K Россия  
Дата: 20.01.02 21:23
Оценка:
Уточнение: проявляется только в "Версия для печати"
Гхм... ;)
От: Dimentiy Россия  
Дата: 29.05.02 02:58
Оценка:
Очевидно, сравнивать библиотеки классов с инициализационным рантаймом — не есть гуд.
Re: Но не забудьте, что такой файл будет медленнее
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.02.02 12:33
Оценка:
Не-аа. Не для любой. Тот же NTFS первые 2 кила хранит прямо в своих структурах, которые обычно в памяти кешируются, а за второй половиной лезет в удаленные кластеры. CDFS вообще все потоком хранит. Так что хреновая это экономия. Да и экономить, там практически нечего. Скорость считывания с диска на два порядка ниже, и эту оптимизацию пропросту не видно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Но не забудьте, что такой файл будет медленнее
От: VladD2 Российская Империя www.nemerle.org
Дата: 02.02.02 12:25
Оценка:
Акститесь. :) О каком времени вы говорите? Вы даже измерить его не сможите. ;o)
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
У Pascal :)
От: Eugene_B  
Дата: 23.01.02 08:30
Оценка:
Вот такой вот код, включающий выделение памяти из кучи,
строки неог. длины, преобразование строки в целое, вещественного в целое, чтение и запись в файл аналогами printf и
scanf дает при компиляции 15 872 b.

program project1;
uses
Windows;
var s: string;
pi: ^integer;
F: Text;
d: double;
c: integer;
begin
Assign (F, 'c:\a.txt');
Reset (F);
readln (F, s);
readln (F, d);
new (pi);
val (s, pi^, c);
if pi^ > d then
MessageBox (0, '>', '', MB_OK)
else
MessageBox (0, '<=', '', MB_OK);
close (F);
ReWrite (F);
writeln (F, d);
writeln (F, pi^);
close (F);
dispose (pi);
end.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.