Могут ли геттеры и сеттеры быть встроенными, когда определение и объявление разделены в файлах .h и .cpp? - PullRequest
2 голосов
/ 08 марта 2011

Я искал и не смог проверить, как компилятор GCC будет обрабатывать встроенные методы получения и установки, когда объявление находится в файле .h, а определение находится в файле .cpp.

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

Я понимаю, что встраивание - это выбор, сделанный компилятором, и он не всегда гарантирован, но при условии оптимальных ситуаций, возможно ли это по крайней мере?

Ответы [ 2 ]

5 голосов
/ 08 марта 2011

(Вы действительно хотели спросить о ситуации, когда определение находится в файле .cpp, отличном от того, который вы сейчас компилируете, а затем связываете его позже. Компилятору нет дела до .hppили .cpp, но около единиц перевода .)

В любом случае, на http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html, прокрутите вниз до «flno»:

Эта опциязапускает стандартный оптимизатор времени соединения.[...] Первые два вызова GCC сохранят представление GIMPLE в виде байт-кода в специальных разделах ELF внутри foo.o и bar.o.Последний вызов будет читать байт-код GIMPLE из foo.o и bar.o, объединять два файла в одно внутреннее изображение и компилировать результат как обычно.Поскольку и foo.o, и bar.o объединены в одно изображение, это приводит к тому, что весь межпроцедурный анализ и оптимизация в GCC работают для двух файлов, как если бы они были одним.Это означает, например, что вкладчик сможет встроить функции в bar.o в функции в foo.o и наоборот.

Итак, да, можно оптимизировать inline через границы модуля.

Однако C ++ по-прежнему требует:

Встроенная функция должнабыть определенным в каждой единице перевода, в которой он используется.[3.2 / 3, C ++ 03]

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

Помните, что запись inline в вашем коде не имеет отношения один к одному с функцией на самом деле получать физическую привязку;это только подсказка компилятору (или компоновщику, если у вас включены вышеупомянутые оптимизации во время компоновки).

0 голосов
/ 08 марта 2011

1 / Функции, объявленные как встроенные , должны быть определены во всех блоках компиляции, где они используются.

2 / При условии правильных аргументов, gcc всегда сможет встроить функции, покаон видит определения, они не должны быть объявлены встроенными.(Но объявление их встроенным поможет сделать определения доступными во всех модулях компиляции, и вам может потребоваться более высокий уровень оптимизации для встроенных функций, не объявленных как встроенные.)

3 / В последних версиях gcc есть возможностьсделать ссылку на оптимизацию времени.IIRC, одна из возможных оптимизаций во время соединения - это встраивание.

...