2013-02-25 5 views
0

Вот фрагмент кода:Сохранение значения перед возвращением в переменной

bool EqualsA(const Foo& a, const Foo& b) 
{ 
    return a == b; 
} 

bool EqualsB(const Foo& a, const Foo& b) 
{ 
    const bool result = a == b; 

    return result; 
} 

int MethodA() 
{ 
    return GetValue() * GetOtherValue(); 
} 

int MethodB() 
{ 
    const int result = GetValue() * GetOtherValue(); 

    return result; 
} 

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

+0

Кажется, бесполезно хранить результат, ничего не делая с ним. – chris

ответ

4

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

Во многих инструментах анализа кода это отмечено как запах кода, и я хотел бы согласиться. Debuggers can be made to see the return value on the stack, поэтому локальная переменная ничего не покупает.

+2

Мне легче отлаживать, когда я храню временные переменные, я могу просто сломать строку и сразу увидеть все «временные». В противном случае, я должен остановить линию до, и входить и выходить, чтобы просматривать все временные по одному за раз –

+0

Мне нравятся временные параметры для отладки. Но 'result = a == b;' для меня слишком много. Все зависит от контекста и от того, сколько усилий оно потребует. –

1

Там почти наверняка не будет никакой разницы. Компилятору разрешено делать то, что ему нравится в вашем коде, если программа ведет себя as-if, так оно было, как вы ее написали. Поэтому любой хороший компилятор избавится от бессмысленных инициализаций.

Однако это может быть ситуация, при которой эта инициализация не может исчезнуть. Если, например, перегрузка operator*, используемая для GetValue() * GetOtherValue(), возвращает результат типа класса по ссылке const, конструктор этого типа класса может иметь некоторые побочные эффекты. Если это так, компилятор не может избавиться от инициализации, поскольку он изменяет наблюдаемое поведение программы.

Но почему это не так, если operator* возвращен стоимостью? Тогда это будет кандидатом на копирование, и компилятор может избавиться от конструкции независимо от того, имели ли он побочные эффекты или нет.

3

При разумном предположении, что значение возвращается выбранной перегрузкой operator == для объектов типа Foo имеет типа bool, достойный компилятор оптимизирует ваш временный магазин прочь при использовании опции тяжелой оптимизации, так , как для работы, это неважно.

Мой совет - выбрать форму, которая сделает ваш код более читаемым или более удобным для вас или отладки.

Смежные вопросы