Встроенный в исходном файле - PullRequest
5 голосов
/ 25 октября 2011

У меня большой класс с множеством служебных функций. эти функции очень малы, и я бы хотел, чтобы они были встроены.

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

Если я отмечу их как встроенные, я получу

символов не найдено

Есть ли способ сделать их встроенными или мне нужно слепо доверять оптимизатору времени соединения?
Мне нужно, чтобы код был переносимым между clang 3 и gcc 4.6, но #define на основе компилятора будет в порядке (так что ответьте, как это сделать только в одном из компиляторов, тоже хорошо).

Ответы [ 5 ]

5 голосов
/ 25 октября 2011

[Эти] функции очень малы, и я хотел бы их встроить.[Но] я не хочу перекомпилировать все при каждом изменении.

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

AFAIK, ни gcc 4.6, ни clang 3 не имеют времени соединениямежду прочим, оптимизаторы, которые до нуля.

Редакция в стороне: Ни один из известных мне компиляторов не обладает достаточной эвристикой, чтобы сделать ненужными ручные аннотации inline.Даже VS2010, который я упомянул в комментариях в качестве примера оптимизатора времени соединения, который является с нуля, все еще нуждается в небольшом совете о том, что встроить.

4 голосов
/ 25 октября 2011

Если вы хотите, чтобы функция была inline, вам нужно поместить ее в заголовочный файл, если только она не используется только в том же исходном файле. Причина в том, что компилятору нужно фактическое определение функции, чтобы поместить определение «inline», где бы оно ни вызывалось, а затем скомпилировать его.

Вы можете найти дополнительную информацию: здесь и здесь .

4 голосов
/ 25 октября 2011

Поместите реализацию в файл .inl.Имейте только необходимые .cpp файлы #include это.Таким образом, изменения в реализации (touch .inl file) инициируют перекомпиляцию только зависимого файла .cpp.Изменения в определении (коснитесь файла .h) вызывают перекомпиляцию всех файлов, использующих объявление.

Это обычная практика как для встроенных функций, так и для реализаций шаблонов.Файлы .inl следует рассматривать в основном как «включенные файлы cpp».

2 голосов
/ 25 октября 2011

Вам нужна функция, обязательно встроенная - вы помещаете ее в определение класса.

1 голос
/ 25 октября 2011

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

http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

...