2016-12-13 8 views
0

Скажем, у меня есть кусок кода, как это:Выполняет ли вычисление в аргументе std :: min() вычислительные накладные расходы?

int y = 1; 
int z = 1; 
int x = std::min(y+1,z); 

Глядя на документацию std::min(here), мне было интересно, создает ли добавление в первом аргументе функции накладные расходы вычисления, то есть ли y+1 является возможно, выполняется дважды.

Причина моего вопроса в том, что документация показывает это в качестве возможной реализации std::min:

template<class T> 
const T& min(const T& a, const T& b) 
{ 
    return (b < a) ? b : a; 
} 

Так кто-нибудь знает, является ли y+1 выполняется в два раза?

+0

«Документация» показывает, что два выражения оцениваются только один раз. –

+8

* «возможно ли, что y + 1 выполняется дважды» *. Как это возможно, если 'min' является функцией, а не макросом? Кажется, вы спрашиваете об этом, потому что вы видели * «выполнено дважды» * в случае макроса, хотя и не понимаете причину * почему * это происходит. Потому что, если вы это хорошо понимаете, вероятно, вы бы не задали этот вопрос. Если это так, то я бы посоветовал вам сначала * понять макрос. – Nawaz

+2

[Окончательный список книг на С ++] (http://stackoverflow.com/a/388282/2069064) – Barry

ответ

2
template<class T> 
const T& min(const T& a, const T& b) 
{ 
    return (b < a) ? b : a; 
} 

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

В вашем конкретном случае временного у + 1 связан с опорным сопзЬ и г связан с опорным сопзЬ б. Затем для выполнения расчета используются a и b.

С другой стороны макросы более опасны в этом смысле.

Типичная реализация MIN макро:

#define MIN(a, b) ((a) < (b)) ? (a) : (b) 

для

MIN(y + 1, z) 

предобработан в:

((y + 1) < (z)) ? (y + 1) : (z) 

что приводит к двойному вычисления у + 1, если y + 1 < z.

+0

Это плохой пример, потому что это, вероятно, не приводит к двойному вычислению в этом случае, только возможность одного. Лучший пример - это что-то вроде MIN (printf («test»), 3); 'или что-то с побочным эффектом, который не может быть устранен. –

+0

@DavidSchwartz Я просто попытался создать пример, который был близок к фрагменту кода, представленному в начале вопроса.Во всяком случае, макро-пример является дополнением к основной части ответа. –