производительность и читаемость на повторяющихся функциях

у меня есть код

void Foo()
{
auto index = currentIndex();
if (index.isValid())
index.doSomething();
}

другой вариант

void Foo()
{
if (currentIndex().isValid())
currentIndex().doSomething();
}

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

1

Решение

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

Компилятор не сможет оптимизировать вызов по многим причинам

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

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

Еще одно замечание: чтобы сделать его более читабельным, не используйте auto, это лучше сохранить для программирования шаблонов, где определить тип может быть непросто.

1

Другие решения

Для меня первый вариант не оставляет вопросов в производительности, что я бы предпочел.

При этом все зависит от контекста, использования и стоимости currentIndex(), Если currentIndex() является тривиальным добытчиком, и Foo() не вызывается в какой-то тяжелой петле, тогда есть небольшая разница, если таковая имеется.

0

По вопросам рекламы [email protected]