2013-11-21 3 views
4

Я работаю над проектом на работе, где в файлах заголовков загружаются и загружаются коды. Если бы я использовал Visual Studio, это не было бы проблемой, так как это предварительно скомпилированные заголовки и т. Д., Но это код Linux GCC.Реализация заголовков и ключевое слово inline для оптимизации

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

Реализации в файлах заголовков встроены или это только подсказка, строка ключевого слова inline? Этот код очень важен для времени, и меня беспокоит перемещение реализаций из заголовков. Могу ли я достичь того же, если я использую ключевое слово inline, а не реализацию в файлах заголовков?

** ОБНОВЛЕНИЕ ** Я знаю, что inline является лишь подсказкой для компилятора. Я не контролирую все в проекте, и я просто хочу переместить все из заголовков в библиотеку, не влияя на производительность. Это будет попытка попробовать и посмотреть? Я просто хочу сохранить производительность точно так же, но увеличить время компиляции.

+2

Вы можете использовать предварительно скомпилированные заголовки с gcc, например. http://stackoverflow.com/questions/58841/precompiled-headers-with-gcc – doctorlove

+0

Если вы переместите реализацию из заголовка, то вы не можете (обычно) объявить ее встроенной. Встроенные функции должны быть определены в каждой единицы перевода, которая их использует. –

+0

Вы пытались построить единое целое? http://buffered.io/posts/the-magic-of-unity-builds Явный шаблонный instanciation также может помочь. вы также можете попытаться разбить заголовочные файлы в реализации встроенных функций и отдельный заголовок с их определением. – Alex

ответ

2

Ключевое слово inline является лишь подсказкой для компилятора, который может потребовать встроить эту функцию. Цель real состоит в том, чтобы позволить вам юридически «нарушить» одно правило определения.

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

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

0

inline - это подсказка для оптимизации, но она также используется для работы с ODR.

Рассмотрите возможность использования оптимизации всей программы/оптимизации времени соединения. Он позволяет реализовать несколько файлов, и в основном все имеет ту же возможность, что и оптимизация (и встроенная), как если бы она была в одной и той же системе перевода.

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

0

Рядный ключевое слово не означает, что функция должна быть реализована «в строке», где вы определяете функцию. Как вы знаете, это подсказка для компилятора, чтобы он попытался скомпилировать, как будто несколько строк в функции находились в том месте, где вы его называете. Таким образом, избегая превышения сохранности адреса для перехода назад, просмотра vtable и т. Д.

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

Попробуйте и переместите реализацию в файл cpp в минимальном примере - основной один объект - одна встроенная функция - один вызов. После реализации в заголовке и один раз в файле cpp. Затем посмотрите на сборку. Нет разницы.

+0

inlining обычно невозможно, есть записи vtable. – Alex

Смежные вопросы