Подтвердить что ты не робот

Неуправляемые функции оптимизируются?

Довольно простой вопрос... Компиляторы в эти дни, как правило, выполняют значительную оптимизацию. Удаляют ли они также неиспользуемые функции из конечного результата?

4b9b3361

Ответ 1

Это зависит от компилятора. Visual С++ 9 может это сделать - неиспользуемые функции static удаляются на этапе компиляции (там даже C4505 warning), неиспользуемые функции с внешними связь может быть удалена на этапе ссылки в зависимости от настроек компоновщика.

Ответ 2

MSVC (компилятор/компоновщик Visual Studio) может сделать это, если вы скомпилируете /Gy и свяжетесь с /OPT:REF.

GCC/binutils может это сделать, если вы скомпилируете -ffunction-sections -fdata-sections и свяжетесь с --gc-sections.

Не знаю других компиляторов.

Ответ 3

Как правило, ответ таков:

Да: для неиспользуемых функций static.

Нет: для неиспользуемых глобально доступных функций.

Компилятор не знает, ссылается ли на него какой-либо другой блок компиляции. Кроме того, большинство типов объектных модулей не позволяют удалять функции после компиляции, а также не дают возможности компоновщику рассказать, существуют ли внутренние ссылки. (Линкер может определить, есть ли внешние.) Некоторые линкеры могут это делать, но многие вещи работают против этого.

Конечно, функция в своем собственном модуле не будет загружаться без необходимости каким-либо компоновщиком, если только она не является частью общей библиотеки. (Потому что это может быть указано в будущем во время выполнения, очевидно.)

Ответ 4

Многие компиляторы делают, но это зависит от конкретной реализации. Отладочные сборки часто включают в себя все функции, позволяющие им вызываться или проверяться внутри отладчика. Многие компиляторы встроенных систем по причинам, которые я не совсем понимаю (*), будут включать все функции в объектном файле, если они включают в себя любые, но полностью исключат любые объектные файлы, которые не используются вообще.

Обратите внимание, что в языках, поддерживающих Reflection (например, Java, С#, vb.net и т.д.), возможно, учитывая имя функции, создать ссылку на нее во время выполнения, даже если в коде не существует ссылок. Например, подпрограмма может принять строку из консоли, каким-то образом изменить ее и сгенерировать вызов функции с помощью этого имени. Невозможно было бы компилятору или компоновщику узнать, какие имена могут быть сгенерированы, и, следовательно, нет способа узнать, какие функции можно безопасно исключить из кода. Однако таких трудностей не существует в C или С++, поскольку для кода не существует определенного способа создания ссылки на функцию, переменную или константу без явной ссылки, существующей в коде. В некоторых реализациях могут быть упорядочены так, что последовательно объявленные константы или переменные будут сохранены последовательно, и таким образом можно создать ссылку на более поздний, добавив смещение к ранее объявленному, но поведение таких трюков явно не гарантируется стандартами C или С++.

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

Ответ 5

С помощью gcc, если вы включите optmizations, он может удалить неиспользуемые функции и мертвый код.

Подробнее о gcc-оптимизации можно найти здесь

Ответ 6

Довольно много времени, да. Его часто называют линкером.

Ответ 7

Когда дело доходит до MS, компоновщик, который позаботится об этом во время фазы ссылки, и компилятор может предупредить вас о неиспользуемых статических функциях (область файлов). Если вы хотите, чтобы компоновщик удалял неиспользуемые функции, вы используете опцию /OPT: REF:

Ответ 9

Все зависит от компилятора и его настроек (встроенные в "отладочные" конфигурации кода вообще не оптимизированы), а также сам код и выравнивание планеты.

В основе лежит следующее: вы не должны беспокоиться об этом. Доверяйте своему компилятору.