Стоимость включения заголовочных файлов в Objective-C - PullRequest
9 голосов
/ 22 апреля 2009

Это может показаться действительно глупым вопросом, но какова стоимость включения (на самом деле, вызова #import) файла заголовка в Objective-C? Я устал от постоянного включения одних и тех же заголовков в разных местах, поэтому я решил просто создать файл GlobalReferences.h, который включает несколько заголовков, на которые обычно ссылаются.

Существуют ли какие-либо заметные затраты на включение ссылок на другие файлы, если они даже не используются? Мой инстинкт говорит мне «нет», так как кажется, что компоновщик только что узнал о других файлах при использовании #import, но я не был уверен, нужно ли принимать особые соображения для разработки iPhone, что касается моего проекта. Есть мысли?

Ответы [ 6 ]

7 голосов
/ 22 апреля 2009

Компоновщик ничего не знает о #import ed файлах. Фактически, компилятор Objective-C о них тоже ничего не знает, они предварительно обработаны препроцессором. Препроцессор эффективно вставляет содержимое заголовков в точку, которую вы включили в ваш исходный файл. Затем фактическому компилятору Objective-C придется обрабатывать дополнительные прототипы функций и определения интерфейсов классов, даже если они не используются. Хотя обычно это не длинная задача, она может увеличить время компиляции. В результате размер и производительность вашего приложения не должны изменяться.

Чтобы увидеть, как выглядит необработанный исходный код (включая все заголовочные файлы, расширенные макросы и т. Д.):

gcc -E your-source-file.m
3 голосов
/ 22 апреля 2009

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

2 голосов
/ 22 апреля 2009

Самый большой недостаток будет во время компиляции. Если все ваши заголовки импортированы в каждый исходный файл, то проект whole придется перестраивать каждый раз, когда вы вносите изменения в файл заголовка.

1 голос
/ 29 сентября 2012

Какова стоимость включения (фактически, вызова #import) файла заголовка в Objective-C?

Компилятор может закончить читать эти файлы без необходимости. После редактирования #import дополнительные файлы необходимо будет проанализировать, скомпилировать и т. Д. Для каждого перевода (например, .m файл), в котором он виден, что значительно увеличивает время сборки и компоновки. В 10 раз больше не удивительно.

Мне надоело постоянно включать одни и те же заголовки в разные места, поэтому я решил просто создать файл GlobalReferences.h, который включает в себя несколько часто упоминаемых заголовков.

Как правило, это очень плохой подход. Общая проблема заключается в том, что при изменении любого из файлов, включенных в GlobalReferences.h, весь ваш проект и все промежуточные зависимости необходимо перестраивать, перекомпоновывать и т. Д.

Я предпочитаю разделять программы на маленькие библиотеки или пакеты, в которых существует такая взаимозависимость (например, StoreKit.framework - это небольшой пакет / библиотека), но заполнение этих библиотек / фреймворков / пакетов в заголовках ничего не решает. Кроме того, предварительные объявления и хранение ваших данных в продолжении класса или @implementation могут значительно уменьшить зависимости (поскольку вы можете локализовать включение библиотеки / заголовка только для необходимых переводов).

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

Есть ли заметная плата за включение ссылок на другие файлы, если они даже не используются?

Абсолютно. Чем больше растут ваши проекты, тем хуже становится ленивое включение. Несколько отложенных включений в большом проекте могут добавить десятки или сотни тысяч строк к большинству ваших скомпилированных файлов и могут вызвать частую перекомпиляцию многих источников. Это значительно усложняет процесс сборки: требования к процессору возрастают, потребление оперативной памяти возрастает, дисковый ввод-вывод возрастает… и снова, это становится все более серьезной проблемой по мере увеличения сложности ваших баз кода / проектов.

1 голос
/ 22 апреля 2009

У меня сложилось впечатление, что это не будет слишком большим ударом: http://en.wikipedia.org/wiki/Objective-C#.23import

0 голосов
/ 22 апреля 2009

Иди и делай это. Если заголовки, которые вы включаете, не являются массивными и вы не используете предварительно скомпилированные заголовки, вы не увидите никакой разницы. Как уже говорили другие, #import - это директива препроцессора. Это не имеет никаких последствий во время выполнения и во многих случаях не имеет существенных последствий во время компиляции.

...