LINUX.ORG.RU

c++ множественный вызов одной и той же функции


0

1

Вариант 1:

void some_method()
{
  cout << func();
  ...
  cout << func();
}

Вариант 2:

void some_method()
{
  result = func();
  cout << result;
  ...
  cout << result;
}

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

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


в общем случае это 2 __разных__ варианта и делают они разные вещи и сравнивать их нельзя.

MKuznetsov ★★★★★ ()

Что же это у вас за примеры такие?

Weres ★★★ ()

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

Выкинь эти примеры.

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

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

Покажи реализацию func.

Если это что-то вроде:

int foo() {
  return 5;
}

То без разницы.

Kuzy ★★ ()

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

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

anonymous ()
Ответ на: комментарий от Kuzy

ну я побыстрому напсевдокодил:

{
  cout << some_ptr->method();
  ...
  cout << some_ptr->method();

}

интересовало, для производительности, лучше запомнить результат в отдельной переменной и вывести ее (готовую) столько сколько нужно? Или же, не парясь, вызывать метод пару раз.

vux ()

Компилятор может «сам понять», если функции чистые и определение видно, или если используются gcc'шные атрибуты pure или const.

cord ()
Ответ на: комментарий от cord

ну вот смотрю видео по Qt, там он в одном методе кучу раз вызывает метод metaObject(). Вот я и подумал почему бы не запомнить мета-обект один раз и к нему обращяться

vux ()

Оба варианта делают одно и тоже

Только если func() - чистая функция без сайд-эффектов.

hlebushek ()

В общем случае приведенные примеры делают не одно и то же.

В первом случае 2 раза отрабатывает функция func() и ты выдаешь в stdout поочередно результаты каждого из выполений.

Во втором случае func() работает 1 раз и ты 2 раза выводишь в stdout ее результат.

Пример: возьмем функцию qrand(), которая при каждом вызове возвращает очередное случайное число. В первом случае вывод в stdout будет разный, во втором - одинаковый.

grondek ()

никогда не вызывай функцию 2 раза, когда можешь сделать это 1 раз

еще лучше делай минифункции inline

хотя, выигрыша все равно не заметишь

unt1tled ★★★★ ()
Ответ на: комментарий от sambist

я не учу с++ по видео, я просто просматриваю как разные люди пишут в процессе

vux ()
Ответ на: комментарий от Weres

Что же это у вас за примеры такие?

Хорошо, что хоть не

void ololo()
и
return trololo;
(см. след. тред).

bk_ ★★ ()
Ответ на: комментарий от vux

ну вот смотрю видео по Qt, там он в одном методе кучу раз вызывает метод metaObject(). Вот я и подумал почему бы не запомнить мета-обект один раз и к нему обращяться

И что изменится? Будешь ты брать указатель из поля другого класса или хранить в выполняемой функции...

erfea ★★★★★ ()
Ответ на: комментарий от vux

интересовало, для производительности, лучше запомнить результат в отдельной переменной и вывести ее (готовую) столько сколько нужно? Или же, не парясь, вызывать метод пару раз.

Зависит от того, что делает вызываемая функция. Если она «тяжёлая» (что-то вычисляет например), но возвращает один и тот же результат, поздравляю с быдлоком. Ежели она возвращает константу (или что посчитанное на этапе компиляции), отдает указатель из поля класса или ещё что простенькое вот без разницы. Или будет у тебя лишний объект на стеке или лишние вызовы функции. Если тебя пугают накладники непосредственно вызова функции, то вряд ли стоит вообще беспокоиться (ну если ты в функцию массив например не копируешь аргументом), это же кресты.

erfea ★★★★★ ()

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

Надо головой думать, а не примерами. В зависимости от того что делает func() более производительным может быть как первый так и второй вариант. И семантически в разных случаях могут быть предпочтительнее разные варианты (). Вдовесок, оба варианта совершенно не обязательно делают одно и то же.

slovazap ★★★★★ ()
Ответ на: комментарий от slovazap

Имелось ввиду именно когда результат один и тот же

{
  metaObject();
  ...
  metaObject();
}
в данном лучае я точно знаю что возвращается один и тотже мета-объект

vux ()

Ага, а еще компилятор сам поймет, что нужно сделать один инкремент вместо трех:

void some_method()
{
  int value = 0;
  cout << ++value;
  ...
  cout << ++value;
  ...
  cout << ++value;
}
andreyu ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.