2010-11-13 2 views
14

A l'heure 0:43:15 dans cette Tech-Talk about D, L'implémentation de la fonction min est discutée. Les préoccupations au sujet de la «stabilité» et du «remaniement supplémentaire» (si les valeurs sont égales) »lorsqu'elles sont utilisées dans certains algorithmes sont proposées comme l'une des raisons de la mise en œuvre présentée. Est-ce que quelqu'un peut fournir un cas d'utilisation réel/pratique (ou fournir une explication plus détaillée) où cette implémentation spécifique de min est "stable" (c'est mieux) par opposition à son autre implémentation possible? Ou est-ce juste un autre exemple d'alpha-geeks allant un peu trop loin?Implémentation correcte de min

mise en œuvre recommandée:

template <class LHS, class RHS, class Return> 
inline Return min(LHS& lhs, RHS& rhs) 
{ 
    return (rhs < lhs) ? rhs : lhs; 
} 

Autre application possible:

template <class LHS, class RHS, class Return> 
inline Return min(LHS& lhs, RHS& rhs) 
{ 
    return (lhs < rhs) ? lhs: rhs; 
} 

Proposition N2199 fournit des implémentations basées sur ce dernier, s'il vous plaît noter que la proposition n'a pas été retenue à ce moment.

Autres propositions pertinentes relatives à min/max sont N1840, N2485 et N2551

+6

Je ne comprends pas. Je ne vois aucun avantage pour l'une des implémentations que vous montrez. À un moment donné, l'un d'entre eux doit être choisi ... –

+1

Je trouve très amusant que la question d'un champ d'application très étroit et d'une applicabilité limitée soit très appréciée lorsqu'une question très générale et applicable à presque tout le monde est appelée sujet'. Je sais que dans la programmation, les détails peuvent être extrêmement importants. Mais celui-ci est très étroitement important et je ne compterais jamais sur la stabilité de min pour être correct dans le code que j'ai écrit de toute façon parce que c'est trop minuscule un détail pour dépendre de quelqu'un qui va bien. – Omnifarious

+5

@Omnifarious: Je pense que vous avez mal compris le problème, ce n'est pas quelque chose de trivial, mais plutôt un problème qui hante le C++ depuis 10 ans, mais pour aller plus loin, l'un des experts mondiaux dans le langage et certaines personnes à une organisation quelque peu prestigieuse comme Google, a fait un commentaire, et fait paraître si normal et "factuel" quand la plupart des gens dans l'industrie seraient d'accord au contraire, que l'on ne peut s'empêcher de se demander si c'est un autre Kepler ou Galileo situation d'appeler le monde entier ... le plus probable est tout simplement un non-sens, mais pourquoi ne pas en discuter? –

Répondre

35

Dans ce cas, je suis assez sûr « stable » se réfère à stable car il est appliqué dans le tri - à savoir que lorsque/si deux éléments sont égaux, ils restent triés dans le même ordre qu'au départ. Pour ce faire, vous voulez retourner lhs quand il est inférieur ou égal à rhs - mais en C++ vous (normalement) voulez le faire en utilisant seulement operator<, sans dépendre de operator<=.

-3

Dans le cas général, il n'y a aucun avantage pour une implémentation par rapport à l'autre. Si vous implémentez min pour un usage spécifique, il peut être judicieux de choisir l'un des formulaires en fonction des données auxquelles il sera appliqué pour tirer le meilleur parti des prédictions de branchement.

Si pour la plupart des cas d'utilisation, le minimum attendu est rhs, choisissez la première implémentation. Si c'est lhs, choisissez la deuxième implémentation.

+0

La prédiction de branchement peut prédire les falses tout aussi utilement que les trues. – Puppy

Questions connexes