Должен ли я использовать `inline` для часто используемых функций? - PullRequest
5 голосов
/ 23 октября 2011

У меня есть класс cnVector, который представляет точку в трехмерном пространстве.Его операторы + - * / используются интенсивно.
Их реализация очень коротка:

cnVector cnVector::operator + (const cnVector& v) const {
    return cnVector(
        x + v.x,
        y + v.y,
        z + v.z );
}

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

Ответы [ 5 ]

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

Помните, что использование inline никогда не является гарантией, оно просто дает подсказку компилятору.Я сомневаюсь, что вставка на самом деле значительно увеличит размер исполняемого файла, сама функция очень мала.
Вызов функции почти такого же размера, как и сама функция.

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

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

См. Также http://msdn.microsoft.com/en-us/library/1w2887zk%28v=vs.80%29.aspx

3 голосов
/ 05 января 2013

Примените inline к всем функциям, которые вы определяете в своем заголовке в области пространства имен, чтобы избежать нарушения Единого правила определения .Это, кстати, совершенно не связано с встраиванием, несмотря на название ключевого слова.(Или поместите их в анонимное пространство имен.)

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

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

Компилятор вполне способен принимать решение о том, включать функцию или нет в зависимости от выбранного профиля оптимизации.

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

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

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

...