hell0w0rd
@hell0w0rd
Просто разработчик

Оптимизирует ли gcc геттеры/сеттеры без inline?

Собственно весь вопрос в заголовке. Под оптимизацией подразумевается автоматический inline, без объявления ключевого слова.
  • Вопрос задан
  • 2691 просмотр
Решения вопроса 1
@RPG
Если тело геттера/сеттера находится в области видимости его использования, то вполне подставляет: goo.gl/zry8bv. Для этого достаточно флага -O2. Впрочем, пример натянутый и далёк от реальности.

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

Далее уже всё зависит от того, что вы делаете - библиотеку или свою собственную программу. В библиотеке методы как правило прячут и не делают их inline, чтобы не вынуждать клиентские программы к перекомпиляции при изменении методов класса.

Мой совет - оставьте этот вопрос до тех пор, пока вы не обнаружите свой геттер или сеттер в верхней строчке профилировщика.

UPD. Эксперимент с новым компилятором (gcc 4.9) показывает, что флаг -O2 -flto таки проводит межпроцедурную inline-оптимизацию автоматически, если это возможно. Второй из доступных мне компиляторов (gcc 4.4) этого делать не умеет - тут ещё нет поддержки LTO. Соответственно при использовании новых компиляторов действительно смысла в inline нет. Вот здесь файлы для тестирования: https://gist.github.com/scriptum/57ae4d2524d42fccb494
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Зависит от опций компилятора. С -O3 должны бы. В связи с автоматическим inline был интересный баг.
Ответ написан
Если определение доступно то, конечно, он может оптимизировать, в зависимости от того используется -O2 или O3 инлайнит он с разной степенью активности. В противном случае вы можете указать при компиляции и линковке флаг -lto (вроде он появился с версии 4.6), но на сколько активно он будет инлайнить и как этим управлять мне не известно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы