Ключевое слово - Inline - Действительно ли заставляет компилятор заменять его в нескольких местах? - PullRequest
1 голос
/ 18 марта 2020

У меня есть следующий код:

static inline void print(const std::string& value)
{
    std::cout<< value <<std::endl;
}

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

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

Встроенная ссылка

1 Ответ

2 голосов
/ 18 марта 2020

Оптимизатор компилятора сложен и будет использовать эвристику, чтобы решить, следует ли встроить код. Есть много факторов, связанных с этим решением, и использование inline, вероятно, рассматривается. Существуют такие вещи, как MSV C __forceinline, которые могут придать большее значение этому решению, но все же не гарантируют его.

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

Самое большое практическое отличие состоит в том, что @arnes сказал:

it разрешает функции, определенные несколько раз в разных единицах перевода, но компилятор ожидает, что все определения одинаковы (в противном случае вызывает неопределенное поведение)

...