87 votes

Utilisation des fonctions min et max en C ++

À partir de C++, sont min et max préférable à d' fmin et fmax? Pour la comparaison de deux nombres entiers, sont-elles fondamentalement les mêmes fonctionnalités?

Avez-vous tendance à utiliser l'un de ces ensembles de fonctions ou préférez-vous écrire votre propre (peut-être à améliorer l'efficacité, la mobilité, la flexibilité, etc.)?

Notes:

  1. Le C++ STL (Standard Template Library) déclare l' min et max fonctions dans le standard C++ de l'algorithme en-tête.

  2. La norme C (C99) fournit l' fmin et fmax fonction dans la norme C math.h en-tête.

Merci à l'avance!

123voto

Cogwheel Points 8656

fmin et fmax sont spécifiquement pour une utilisation avec des nombres à virgule flottante (d'où le "f"). Si vous l'utilisez pour les services de renseignements, vous pouvez souffrir de la performance ou de précision, les pertes dues à la conversion, appel de fonction, les frais généraux, etc. en fonction de votre compilateur/plate-forme.

std::min et std::max sont des templates de fonctions qui fonctionnent sur n'importe quel type avec un moins (<) de l'opérateur, de sorte qu'ils peuvent fonctionner sur n'importe quel type de données qui permet une telle comparaison. Vous pouvez également fournir votre propre fonction de comparaison si vous n'avez pas envie de travailler à partir d' <.

C'est plus sûr puisque vous avez à convertir explicitement les arguments de match quand ils ont des types différents. Le compilateur ne vous laisse pas accidentellement convertir un 64-bit int dans un 64-bit à virgule flottante, par exemple. Cette raison à elle seule les modèles par défaut de votre choix. (Crédit à Matthieu M & bk1e)

Même lorsqu'il est utilisé avec des flotteurs, le modèle peut gagner en performance. Un compilateur a toujours l'option de l'in-lining appels de modèle de fonctions puisque le code source est la partie de l'unité de compilation. Parfois, il est impossible de l'inclure un appel à une fonction de la bibliothèque, d'autre part (bibliothèques partagées, l'absence de lien d'optimisation, etc.).

18voto

J Ridges Points 61

Vous manquez le point entier de fmin et fmax. Il a été inclus dans C99 afin que les processeurs modernes puissent utiliser leurs instructions natives (lire SSE) pour virgule flottante min et max et éviter un test et une branche (et donc une branche éventuellement mal prédite). J'ai réécrit le code qui utilisait std :: min et std :: max pour utiliser les composants intrinsèques de SSE pour les boucles interne et minimale dans les boucles internes et l'accélération était significative.

6voto

sellibitze Points 13607

std :: min et std :: max sont des modèles. Donc, ils peuvent être utilisés sur une variété de types qui fournissent le moins que l'opérateur, y compris les flotteurs, les doubles, les doubles longs. Donc, si vous voulez écrire du code C ++ générique, vous feriez quelque chose comme ceci:

 template<typename T>
T const& max3(T const& a, T const& b, T const& c)
{
   using std::max;
   return max(max(a,b),c); // non-qualified max allows ADL
}
 

En ce qui concerne les performances, je ne pense pas que fmin et fmax diffèrent de leurs homologues C ++.

6voto

Jerry Coffin Points 237758

Si votre application fournit un type entier 64 bits, vous pouvez obtenir un autre (mauvaise) réponse en utilisant fmin ou fmax. Votre les entiers 64 bits sera converti en double, ce qui sera (au moins en général) ont un significande inférieure à 64-bits. Lorsque vous convertir un nombre en double, certains des bits de poids faible peut/va être complètement perdu.

Cela signifie que les deux nombres qui ont été vraiment différent pourrait à terme d'égalité lorsqu'ils sont convertis en double -- et le résultat sera que nombre incorrect, ce n'est pas nécessairement égal à l'une des entrées initiales.

4voto

Eric Melski Points 8325

Je préférerais les fonctions C ++ min / max, si vous utilisez C ++, car elles sont spécifiques au type. fmin / fmax forcera tout à être converti en / en virgule flottante.

De plus, les fonctions C ++ min / max fonctionnent avec les types définis par l'utilisateur tant que vous avez défini l'opérateur <pour ces types.

HTH

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X