44 votes

Quelle est l’implication de rendement de conversion vers bool en C++ ?

[Cette question est liée mais n'est pas la même chose que ce un.]

Mon compilateur signale implicitement de la conversion ou de coulée de certains types bool alors que les conversions explicites ne produisent pas un avertissement:

long t = 0;
bool b = false;
b = t;                        // performance warning: forcing long to bool
b = (bool)t;                  // performance warning
b = bool( t );                // performance warning
b = static_cast< bool >( t ); // performance warning
b = t ? true : false;         // ok, no warning
b = t != 0;                   // ok
b = !!t;                      // ok

C'est avec Visual C++ 2008 mais je soupçonne que d'autres compilateurs peuvent avoir les mêmes mises en garde.

Donc ma question est: quelle est la performance de l'implication de coulée/conversion d' bool? N'conversion explicite de meilleures performances dans certaines circonstances (par exemple, pour certaines architectures cibles ou processeurs)? N'conversion implicite en quelque sorte confondre l'optimiseur?

Microsoft explication de leur avertissement n'est pas particulièrement utile. Ils sous-entendent qu'il y a une bonne raison, mais ils ne l'explique pas.

36voto

paercebal Points 38526

J'ai été intrigué par ce comportement, jusqu'à ce que j'ai trouvé ce lien:

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=99633

Apparemment, venant de Microsoft Développeur qui est "propriétaire" de cet avertissement:

Cet avertissement est étonnamment utile, et a trouvé un bug dans mon code juste hier. Je pense que Martin est la prise de "" avertissement sur les performances de contexte.

Il n'est pas sur le code généré, c'est sur si oui ou non le programmeur a fait part de l'intention de modifier une valeur de type int bool. Il y a une pénalité pour cela, et la l'utilisateur a le choix d'utiliser "int" au lieu de "bool" systématiquement (ou plus susceptibles vice-versa) afin d'éviter la "boolifying" codegen. [...]

C'est un vieux avertissement, et peut avoir dépassé son but, mais c'est se comporter comme prévu ici.

Il me semble donc que l'avertissement est plus une question de style et d'éviter certaines erreurs qu'autre chose.

Espérons que cela répondra à votre question...

:-p

5voto

Bill Forster Points 3298

La performance d'avertissement en fait de faire un peu de sens. Je l'ai eu aussi et ma curiosité m'a amené à étudier avec le désassembleur. Il essaie de vous dire que le compilateur doit générer du code pour forcer la valeur à 0 ou 1. Parce que vous êtes en insistant sur un bool, la vieille école C idée de 0 ou quoi que ce soit d'autre ne s'applique pas.

Vous pouvez éviter ce petit gain de performance si vous le voulez vraiment. Le meilleur moyen est d'éviter la fonte complètement et utiliser un bool depuis le début. Si vous devez avoir un int, vous pouvez simplement utiliser si( int ) au lieu de if( bool ). Le code généré sera simplement de vérifier si le type int est 0 ou pas. Pas de code supplémentaire pour vous assurer que la valeur est 1 si elle n'est pas 0 sera généré.

3voto

coppro Points 10692

Autant que je sache, il n'y a pas d'avertissement sur un autre compilateur pour cela. La seule façon que je peux penser que ce serait la cause d'une perte de performance est que le compilateur doit comparer l'ensemble entier de 0 et attribuer à l'bool correctement (contrairement à une conversion comme un char de bool, où le résultat peut être copié car un bool est un octet, et donc ils sont effectivement les mêmes), ou intégrante de conversion qui implique la reproduction de certains ou de la totalité de la source à la destination, éventuellement après un zéro de la destination, si c'est plus grand que la source (en termes de mémoire).

C'est encore un de Microsoft est inutile et inutile idées sur ce qui constitue le bon code, et nous conduit à mettre en place avec stupide définitions comme ceci:

template <typename T>
inline bool to_bool (const T& t)
  { return t ? true : false; }

3voto

Craig Points 15049

On dirait une optimisation prématurée pour moi. Êtes-vous qui attend l’exécution du casting à sérieusement affecter la performance de votre application ? Peut-être que si vous écrivez du code ou dispositif de pilotes du noyau, mais dans la plupart des cas, ils sont tous devraient être OK.

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