Аннотация :
Статья посвящена вопросам оптимизации размера выполняемых модулей, генерируемых различными
компиляторами C++ (основное внимание уделено MS Visual С++). С этой целью рассматриваются особенности Библиотеки исполнения C/C++ и ее реализаций, а также процессы компиляции и компоновки приложений. Приведены практические приемы, позволяющие в ряде случаев уменьшить размер приложения до величины 3-4 килобайта.
До прочтения статьи, я незнал про секретную опцию (/opt:nowin98) поэтому пришлось найти меене секретную (/ALIGN).
и того #pragma comment(linker, "/ALIGN:0x1000 0x200") дает в принципе тотже результат имхо...
А, да, про лишнее то чуть незабыл =)
В ехешнике между dos-stub и PE заголовком есть какаято абра кадабра которую имхо не кто не юзает (я точно), так вот как от нее избавиться то?
>> Но встречаются случаи, когда считаешь буквально каждый байт исполняемого модуля. Это может >> быть ядро инсталлятора или самораспаковывающегося архива....
Господа, а про ASM вы случайно не зыбыли ?
В случае, если требуется действительно минимальный объем EXE, единственный выход — ASM.
Незачем кастрировать C++ для того, что можно сделать на ассемблере без усилий :)
P.S. А если в PE сделать всего 1 секцию, то и выравнивание значения не имеет :)
Получается, что в ядре есть аналоги ко многим функциям CRT. В KB даже есть статья "Win32 Equivalents for C Run-Time Functions" (Article ID: Q99456).
Но если я не могу обойтись без разбора строки функцией sscanf? Получается, что из-за одной функции мне придется использовать CRT? Или извращаться ручками из строки вытаскивать разного типа переменные... вот такой from gates...
Но не забудьте, что такой файл будет медленнее ...
-> Но не забудьте, что такой файл будет медленнее загружаться в память...
Да, 3 кб будет медленее загружаться чем 33 — железная логика (MS)! Я долго смеялся ...
У каждого, как известно, свое мнение о предпочтительном инструменте для каждой конкретной задачи. Но тот факт, что С и C++ являются признанными лидерами системного программирования, я думаю, очевиден.
PS: И, как обычно, оптимизировав модуль на C++, можно "довести" его, использовав сгенерированный листинг ASM...
А чем VariantChangeType не устраивает (для преобразования из строки в число)?
А парсить строку по формату — не такая уж тривиальная операция. За ее наличие "нахаляву" не жалко и 30 Кб заплатить...
Успехов,
Виталий.
Re: Но не забудьте, что такой файл будет медленнее
Не железная, а титановая с вольфрамовым армированием. Причем, совершенно справедливая.
Дело в том что операционке (точнее ее дисковой подсистеме) проше и быстрее читать данные с гранулярностью в кластер (те же 4 кила). И это будет справедливо для любой файловой системы и для любой операционки.
А приятно что что один отдел большого мелкософта (компиляторщики) нашел общий язык с другим отделом (операционщиками)...
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
Re: Но не забудьте, что такой файл будет медленнее
Ну, из 30-килобайтного файла 3-килобайт опцией /opt:nowin98 не получишь. Для статического рантайма выигрыш всего-то около 7 килобайт. Чем больше размер EXE, тем меньше относительный выигрыш (и тем большую цену мы платим за размер, проигрывая в скорости загрузки).
Не-аа. Не для любой. Тот же NTFS первые 2 кила хранит прямо в своих структурах, которые обычно в памяти кешируются, а за второй половиной лезет в удаленные кластеры. CDFS вообще все потоком хранит. Так что хреновая это экономия. Да и экономить, там практически нечего. Скорость считывания с диска на два порядка ниже, и эту оптимизацию пропросту не видно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Но не забудьте, что такой файл будет медленнее
Вот такой вот код, включающий выделение памяти из кучи,
строки неог. длины, преобразование строки в целое, вещественного в целое, чтение и запись в файл аналогами 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.