Вызов встроенных функций C ++ - PullRequest
0 голосов
/ 27 июня 2009

У меня есть встроенная функция-член, определенная в классе MyClass

int MyClass::myInlineFunction();

Эта функция вызывается из нескольких мест в моем коде.
Есть два способа вызвать эту функцию
Случай 1: Использование при каждом вызове функции.

 mobj->myInlineFunction() ;

Случай 2: присвоить результат этой функции переменной и использовать его для последующих обращений

 var = mobj->myInlineFunction() ;

Какой из них предпочтительнее ??

Ответы [ 7 ]

3 голосов
/ 27 июня 2009

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

  • вам не нужны побочные эффекты от функции
  • функция всегда будет возвращать один и тот же результат в этом контексте
1 голос
/ 27 июня 2009

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

1 голос
/ 27 июня 2009

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

0 голосов
/ 27 июня 2009

Оптимизация без знания того, что или где обычно заканчивается более сложным кодом, который не быстрее оригинального.

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

  • Если метод является аксессором (просто возвращает внутреннее значение, как в std :: vector <> :: size ()), тогда сделайте его встроенным и не кэшируйте результат.
  • Если метод выполняет значительную работу, не делайте его встроенным и не измеряйте (вы не можете измерить встроенный метод), сколько раз он вызывается, какую стоимость он представляет.Затем решите, подходит ли кэширование или вставка.
  • Кэширование результата (ваш случай 2) может быть улучшением для дорогих методов, но только если гарантируется, что значение не изменится между использованиями, и в этом случае яне будет делать метод встроеннымваш буфер)
0 голосов
/ 27 июня 2009

К сожалению, нет простого ответа, это зависит от функции.

Если функция тривиальна, что-то вроде {return 6; }, просто звоните каждый раз. Компилятор встроит вызов и удалит код. Вы не должны найти разницы между назначением его переменной или нет.

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

0 голосов
/ 27 июня 2009

Если функция возвращает один и тот же результат для каждого вызова, вы должны использовать регистр 2, поскольку нет смысла использовать регистр 1, даже если это встроенная функция

0 голосов
/ 27 июня 2009

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

Но наверняка первый способ - самодокументирование.

РЕДАКТИРОВАТЬ :: Спасибо Ахмед,

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

Опять же, первый способ для меня яснее, по крайней мере, если оба работают.

...