Преимущества объявления функции как “встроенная”?

Можно ли реализовать это как подставляемую функцию?

#define my_free(x) do { free(x); x = NULL; } while (0)
6
задан Sam 9 December 2009 в 18:43
поделиться

9 ответов

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

7
ответ дан 8 December 2019 в 12:20
поделиться

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

4
ответ дан 8 December 2019 в 12:20
поделиться

Обычно современные компиляторы «встраивают» вещи, которые они считают важными. Я бы позволил ему сделать это за вас.

Редактировать:

Знаете что, прочитав, что написали другие? Я думаю, что я позволил бы ему обрабатывать большую часть встраиваемого THEN профиля вашего кода и THEN встроенных функций, которые являются узкими местами. Мой совет слегка окрашен одним разработчиком, с которым я работаю, который предварительно оптимизирует весь свой код. Половину времени мне нужно потратить 5 мин. просто выясняет, чего пытается достичь.

3
ответ дан 8 December 2019 в 12:20
поделиться

В FAQ по C ++ есть полезная информация по этому поводу. Я предпочитаю использовать встроенную функцию, поскольку она дает компилятору больше информации о том, что я «хотел бы» сделать. Будет ли компилятор встраивать его, зависит от него, но небольшая помощь ему не повредит.

2
ответ дан 8 December 2019 в 12:20
поделиться

Как все уже сказали, ключевое слово - это всего лишь подсказка, но большинство компиляторов воспринимают ее довольно серьезно. Кроме того, большинство компиляторов очень плохо встраивают функции из разных модулей компиляции - если вы определите Foo () в файле ac , но вызовете его в bc , шансы, что он будет разумно встроить bc в вызовы Foo () , довольно малы. (на самом деле, это вообще не произойдет без LTCG.), поэтому его стоит использовать, когда вы уверены, что функция действительно должна быть встроена. Это решение лучше всего принимать эмпирическим путем.

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

3
ответ дан 8 December 2019 в 12:20
поделиться

Вы не можете быть абсолютно уверены, что компилятор поймает «критические» участки вашего кода: используйте «встроенный», когда знаете, что это важно.

Компилятор не профилировщик .

0
ответ дан 8 December 2019 в 12:20
поделиться

Разница вряд ли будет иметь значение.

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

0
ответ дан 8 December 2019 в 12:20
поделиться

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

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

0
ответ дан 8 December 2019 в 12:20
поделиться

Объявление бесполезно и сильно отличается от первоначального намерения. Компиляторы взяли на себя гораздо больше свободы в отношении того, что и что не следует встраивать (IMO).

Это подсказка компилятору, его использование поможет вам и только иногда имеет желаемое значение.

Если вам нужно написать критически важное значение для производительности программы, не полагайтесь на компилятор (знание производительности и оптимизации не изучается за день). Обычно есть способ переопределить мнение компилятора (а не просто намекнуть на ваши предпочтения), чтобы принудительно встраивать. Таким образом я объявляю функцию / метод встроенными более чем в 95% случаев (зная также, когда это неявно). Если / когда вы знаете, что вам нужно знать, как правильно встраивать, тогда также используйте принудительное встраивание, но узнайте, когда и как его использовать.

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

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

Еще одна вещь: вы получите другое связь с C ++.

0
ответ дан 8 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

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