2016-12-13 1 views
0

Disons que j'ai un morceau de code comme ceci:Le calcul dans l'argument std :: min() crée-t-il un surdébit de calcul?

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

regardant la documentation de std::min(here), je me demandais si l'ajout dans le premier argument de la fonction crée une surcharge de calcul, à savoir si y+1 est éventuellement exécuté deux fois.

La raison de ma question est que la documentation montre cela comme une mise en œuvre possible de std::min:

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

ne donc que quelqu'un sait, si y+1 est exécuté deux fois?

+0

"La documentation" montre que les deux expressions ne sont évaluées qu'une seule fois. –

+8

* "si y + 1 est éventuellement exécuté deux fois" * .. Comment est-ce possible même si 'min' est une fonction, pas une macro? Il semble que vous posiez cette question parce que vous avez vu * "exécuté deux fois" * en cas de macro, mais sans comprendre la raison * pourquoi * cela se produit. Parce que si vous aviez bien compris, vous n'auriez probablement pas posé cette question. Si c'est le cas, je vous conseille de * comprendre * le macro-cas en premier. – Nawaz

+2

[La liste des livres définitifs C++] (http://stackoverflow.com/a/388282/2069064) – Barry

Répondre

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

Il est facile de voir que dans cette mise en œuvre possible chaque argument de la fonction min est calculé exactement une fois.

Dans le cas particulier temporaire y + 1 est lié à la référence constun et z est lié à la référence constb. Puis un et b sont utilisés pour effectuer un calcul. De l'autre côté, les macros sont plus dangereuses en ce sens.

La mise en œuvre typique de MIN macro:

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

pour

MIN(y + 1, z) 

est prétraitée dans le:

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

qui conduit au double calcul de y + 1 si y + 1 < z.

+0

C'est un mauvais exemple, car il ne conduit probablement pas à un double calcul dans ce cas, seulement la possibilité d'un. Un meilleur exemple serait quelque chose comme 'MIN (printf (" test "), 3);' ou quelque chose avec un effet secondaire qui ne peut pas être éliminé. –

+0

@DavidSchwartz J'ai juste essayé de créer un exemple proche du code fourni au début de la question.Quoi qu'il en soit, l'exemple de macro est un ajout à la partie principale de la réponse. –