подскажите мне существует ли компилятор который бы не вставлял в код кучу мусора.
пример:
---
void x(){
prinft("this is SUXX");
}
void main()
{
prinf ("is it?");
}
---
далее откомпилировав в lcc, cl и IntelC 7.0 я получил в исполняемом файле содержание строки "this is SUXX", далее я удалил из main printf, однако printf.obj так же линковался, как-будто я его собирался вызывать... это подвердилось тем что, удаляя из кода функцию x() я получаю уменьшение размера
исполняемого кода... аналогичное утверждение верно и для паскаля...
Всё что описано полюбому будет линковаться. Откуда компилятор может знать, что ты не создал указатель на эту функцию каким-либо косвенным образом?
Или не делаешь асмовскую вставку прямого кода, которая дёрнется вызывать эту функцию.
Ваша программа работает корректно? Один звонок и я всё исправлю!
Здравствуйте, Багер, Вы писали:
Б>Всё что описано полюбому будет линковаться. Откуда компилятор может знать, что ты не создал указатель на эту функцию каким-либо косвенным образом? Б>Или не делаешь асмовскую вставку прямого кода, которая дёрнется вызывать эту функцию.
А по-моему a) косвенные способы можно было бы отключать ключиками (опциями), б) это не хороший стиль — ссылки на функции косвенным способом.
в) Все остальные случаи, при которых есть ссылка на идентефикатор функции imho отслеживаются без всяких проблем, в том чесле и в asm вставке...
А количества мусора, в следствии того что я импользую одну функцию из библиотеки — это хороший стиль ли?! у меня получаеться что бы написать 2+2 я подключаю к коду мусора на 30-40 (а у некоторых и до 300Kb) в то время как сам полезный код — 1kB. итак КПД — 1/30 ~ 3% а иногда и 1/300 ~ 0.3% :)) очень хорошее качество кода вероятно ?! ... да КПД конечно повыситься как только программа будет разрастаться но не приблизиться и к 50% :(
Здравствуйте, gst, Вы писали:
gst>подскажите мне существует ли компилятор который бы не вставлял в код кучу мусора.
В MSVC используй ключ к линкеру /OPT:REF
Он не включает в собранный образ (exe, dll) секции, которые не используются в программе.
Учти, что С/С++ работает на уровне модулей и соответственно в обычном режиме в секцию попадает модуль целиком (весь код из одного CPP)
Исключить отдельные функции ты можешь используя расишрение компилятора — Function Level Linking (не помню ключ). Тогда каждая функция помещается в отдельную секцию объектного файла и линкер может выкинуть неиспользуемые секции.
Во многих компиляторах/линкерах есть подобные возможности.
Здравствуйте, orangy, Вы писали:
O>В MSVC используй ключ к линкеру /OPT:REF O>Он не включает в собранный образ (exe, dll) секции, которые не используются в программе. O>Учти, что С/С++ работает на уровне модулей и соответственно в обычном режиме в секцию попадает модуль целиком (весь код из одного CPP) O>Исключить отдельные функции ты можешь используя расишрение компилятора — Function Level Linking (не помню ключ). Тогда каждая функция помещается в отдельную секцию объектного файла и линкер может выкинуть неиспользуемые секции. O>Во многих компиляторах/линкерах есть подобные возможности.
Итак я попробывал тот же пример откомпилировать так:
cl /O1 /Gy /Gi test.c
link /OPT:REF /OPT:NOWIN98 test.obj
убрав из main() — printf() я получил код в 18Kb, затем убрав printf из функции нигде не вызываемой, я получил 14Kb, что означает что printf подключался несмотря на то что не был использован и не мог быть использован... хотя строчка "...SUXX" уже отсутвовала в получаемом .exe...
относительно модульности C++ это вопрос спорный — откуда там вообще модули если их там никогда не было — код просто разделённый по файлам, согласно твоей логике... весь C++ собирается в одну кучу, а #include это просто команда препроцессора включающего другой файл для корректной компиляции в смысле типов :( так что я не понимаю какая может быть в C++ модульность... imho даже Буч говорил что C++ не модульный язык...
Здравствуйте, gst, Вы писали:
gst>подскажите мне существует ли компилятор который бы не вставлял в код кучу мусора. gst>пример: gst>--- gst>void x(){ gst> prinft("this is SUXX"); gst>}
gst>void main() gst>{ gst> prinf ("is it?"); gst>} gst>--- gst>далее откомпилировав в lcc, cl и IntelC 7.0 я получил в исполняемом файле содержание строки "this is SUXX", далее я удалил из main printf, однако printf.obj так же линковался, как-будто я его собирался вызывать... это подвердилось тем что, удаляя из кода функцию x() я получаю уменьшение размера gst>исполняемого кода... аналогичное утверждение верно и для паскаля...
Линуксовый gcc этим обычно не страдает, если оптимизацию включить. Хотя компилять им под винды не шибко удобно.
Здравствуйте, gst, Вы писали:
O>>Во многих компиляторах/линкерах есть подобные возможности.
gst>Итак я попробывал тот же пример откомпилировать так:<...>
Приведи таблицу связей функций/файлов, размеров и наличия "лишней" информации. И не с именами ключей, а с их понятным названием
Тогда можно будет по-анализировать. Если сделаешь это для разных компилеров — будет вообще хорошо.
gst>что означает что printf подключался несмотря на то что не был использован и не мог быть использован...
Может использоваться в CRT, например для печати сообщения "floating point not loaded", "unhandled exception" (исключения выключил?) и т.п.
gst>относительно модульности C++ это вопрос спорный — откуда там вообще модули если их там никогда не было — код просто разделённый по файлам, согласно твоей логике...
Я имел ввиду раздельную компиляцию. См. фазы трансляции в стандарте.
... << RSDN@Home 1.0 beta 2 | слушаю Limp Bizkit — No sex>>