C++ и C компиляторы
От: gst  
Дата: 07.12.02 14:35
Оценка:
подскажите мне существует ли компилятор который бы не вставлял в код кучу мусора.
пример:
---
void x(){
prinft("this is SUXX");
}

void main()
{
prinf ("is it?");
}
---
далее откомпилировав в lcc, cl и IntelC 7.0 я получил в исполняемом файле содержание строки "this is SUXX", далее я удалил из main printf, однако printf.obj так же линковался, как-будто я его собирался вызывать... это подвердилось тем что, удаляя из кода функцию x() я получаю уменьшение размера
исполняемого кода... аналогичное утверждение верно и для паскаля...
Re: [moderator] C++ и C компиляторы
От: Павел Кузнецов  
Дата: 07.12.02 14:39
Оценка:
Здравствуйте, gst, Вы писали:

gst>подскажите мне существует ли компилятор который <...>


Перенесено в форум "Средства разработки" -- ПК.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: [moderator] C++ и C компиляторы
От: Багер  
Дата: 07.12.02 15:29
Оценка:
Всё что описано полюбому будет линковаться. Откуда компилятор может знать, что ты не создал указатель на эту функцию каким-либо косвенным образом?
Или не делаешь асмовскую вставку прямого кода, которая дёрнется вызывать эту функцию.
Ваша программа работает корректно? Один звонок и я всё исправлю!

Делаю потенциальные фичи :))
Re[3]: [moderator] C++ и C компиляторы
От: gst  
Дата: 09.12.02 06:15
Оценка:
Здравствуйте, Багер, Вы писали:

Б>Всё что описано полюбому будет линковаться. Откуда компилятор может знать, что ты не создал указатель на эту функцию каким-либо косвенным образом?

Б>Или не делаешь асмовскую вставку прямого кода, которая дёрнется вызывать эту функцию.

А по-моему a) косвенные способы можно было бы отключать ключиками (опциями), б) это не хороший стиль — ссылки на функции косвенным способом.
в) Все остальные случаи, при которых есть ссылка на идентефикатор функции imho отслеживаются без всяких проблем, в том чесле и в asm вставке...

А количества мусора, в следствии того что я импользую одну функцию из библиотеки — это хороший стиль ли?! у меня получаеться что бы написать 2+2 я подключаю к коду мусора на 30-40 (а у некоторых и до 300Kb) в то время как сам полезный код — 1kB. итак КПД — 1/30 ~ 3% а иногда и 1/300 ~ 0.3% :)) очень хорошее качество кода вероятно ?! ... да КПД конечно повыситься как только программа будет разрастаться но не приблизиться и к 50% :(
Re: C++ и C компиляторы
От: orangy Россия
Дата: 09.12.02 06:31
Оценка: 7 (1)
Здравствуйте, gst, Вы писали:

gst>подскажите мне существует ли компилятор который бы не вставлял в код кучу мусора.

В MSVC используй ключ к линкеру /OPT:REF
Он не включает в собранный образ (exe, dll) секции, которые не используются в программе.
Учти, что С/С++ работает на уровне модулей и соответственно в обычном режиме в секцию попадает модуль целиком (весь код из одного CPP)
Исключить отдельные функции ты можешь используя расишрение компилятора — Function Level Linking (не помню ключ). Тогда каждая функция помещается в отдельную секцию объектного файла и линкер может выкинуть неиспользуемые секции.
Во многих компиляторах/линкерах есть подобные возможности.
... << RSDN@Home 1.0 beta 1 | слушаю тишину>>
"Develop with pleasure!"
Re[2]: C++ и C компиляторы
От: gst  
Дата: 10.12.02 05:19
Оценка:
Здравствуйте, 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++ не модульный язык...
Re: C++ и C компиляторы
От: Dront Россия  
Дата: 10.12.02 07:44
Оценка:
Здравствуйте, 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 этим обычно не страдает, если оптимизацию включить. Хотя компилять им под винды не шибко удобно.
WBR, Andrey Reznik (2:5020/2999, Andrey_Reznik@rambler.ru)
Re[3]: C++ и C компиляторы
От: orangy Россия
Дата: 10.12.02 08:03
Оценка:
Здравствуйте, gst, Вы писали:

O>>Во многих компиляторах/линкерах есть подобные возможности.


gst>Итак я попробывал тот же пример откомпилировать так:<...>

Приведи таблицу связей функций/файлов, размеров и наличия "лишней" информации. И не с именами ключей, а с их понятным названием
Тогда можно будет по-анализировать. Если сделаешь это для разных компилеров — будет вообще хорошо.

gst>что означает что printf подключался несмотря на то что не был использован и не мог быть использован...

Может использоваться в CRT, например для печати сообщения "floating point not loaded", "unhandled exception" (исключения выключил?) и т.п.

gst>относительно модульности C++ это вопрос спорный — откуда там вообще модули если их там никогда не было — код просто разделённый по файлам, согласно твоей логике...


Я имел ввиду раздельную компиляцию. См. фазы трансляции в стандарте.
... << RSDN@Home 1.0 beta 2 | слушаю Limp Bizkit — No sex>>
"Develop with pleasure!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.