Outils pour utilisateurs

Outils du site


lang:cpp:condition

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
lang:cpp:condition [2020/02/04 05:40] – Ajout de "[[unlikely]] et [[likely]]" rootlang:cpp:condition [2020/06/16 15:15] (Version actuelle) – Fix typo root
Ligne 1: Ligne 1:
 ====if==== ====if====
-===Condition classique=== 
-<code cpp> 
-if () 
-{ 
-  plusieurs instructions; 
-} 
-else if () 
-  une instruction; 
-else 
-  une instruction; 
-</code> 
  
-Attention aux ''else'' s'il y a des ''if'' imbriqués : +Les ''if'' peuvent s'optimiser avec les attributs [[lang:cpp:attribut#unlikely_et_likely|unlikely et likely]].
- +
-<code cpp+
-if () +
-  if () +
-    une instruction; +
-else // Ici, l'indentation est mauvaise car le else correspond au second if. +
-  une instruction; +
-</code>+
  
-===fold===+===Conditions multiples sur une même valeur : fold (opérateur ...)===
 Avec les templates variadiques : Avec les templates variadiques :
  
Ligne 43: Ligne 24:
 [[https://h-deb.clg.qc.ca/Sujets/Divers--cplusplus/Fold-expressions.html|C++ et les Fold Expressions]] {{ :lang:cpp:condition:c_et_les_fold_expressions_2020-01-05_18_59_43_.html |Archive du 2016/11/27 le 05/01/2020}} [[https://h-deb.clg.qc.ca/Sujets/Divers--cplusplus/Fold-expressions.html|C++ et les Fold Expressions]] {{ :lang:cpp:condition:c_et_les_fold_expressions_2020-01-05_18_59_43_.html |Archive du 2016/11/27 le 05/01/2020}}
  
-====switch==== +====switch/case==== 
-===Cas courant=== + 
-Les ''switch''/''case'' agissent comment des ''goto''. Il faut donc mettre un break pour éviter de passer à l'instruction suivante.+Les ''switch''/''case'' peuvent s'optimiser avec les attributs [[lang:cpp:attribut#unlikely_et_likely|unlikely et likely]]. 
 + 
 +===Déclaration d'une variable dans un switch=== 
 +Une variable définie dans un ''case'' est accessible pour tous les ''case'' le suivant. On ne peut donc définir dans un ''case'' que des variables ayant un constructeur ''default''. 
 + 
 +Il est donc conseillé de mettre des ''{}'' entre chaque ''case''. 
 <code cpp> <code cpp>
-int i = 0; +class A
-switch (i)+
 { {
 +    public:
 +    A() = default;
 +};
 +
 +class B
 +{
 +    public:
 +    B(){}
 +};
 +
 +int main()
 +{
 +  int i = 0;
 +  switch (i)
 +  {
   case 0:   case 0:
-    i = 2; +    // Valide car la classe A a un constructeur default. 
-    // break+    A a
-    // Sans break, l'instruction = 3 sera executée.+    // Non car si vaut 1, le constructeur b ne sera pas appelé. 
 +    // error: cannot jump from switch statement to this case label 
 +    // B b1; 
 +    break;
   case 1:   case 1:
-    i = 3;+  { 
 +    // Valide car b2 ne sera pas accessible en dehors de case 1. 
 +    B b2; 
 +    break; 
 +  }
   case 2:   case 2:
   default:   default:
 +    break;
 +  }
 } }
 </code> </code>
Ligne 88: Ligne 98:
 </code> </code>
  
-<note important>Toute création d'un hash présente un risque de collision.</note>+<WRAP center round important 60%> 
 +Toute création d'un hash présente un risque de collision. 
 +</WRAP>
  
-[[https://github.com/vivkin/constexprhash|constexprhash github]] {{ :lang:cpp:condition:constexprhash.h |Archive du 24/08/2016 le 05/01/2020}} 
- 
-====[[unlikely]] et [[likely]]==== 
-Il est possible d'indiquer au compilateur si une condition est généralement vraie ou fausse. Cela fonctionne sur ''if'' et ''case''. 
- 
-<code cpp> 
-int i = 1; 
-if (i == 1) [[likely]] 
-  ... 
-</code> 
- 
-<code cpp> 
-int f(int i) 
-{ 
-  switch(i) 
-  { 
-    case 1: return 1; 
-    [[likely]] 
-    case 2: return 2; 
-    [[unlikely]] 
-    default: return 3; 
-  } 
-  return 2; 
-} 
-</code> 
- 
-Code généré sans les attributs ''%%[[likely]]%%'' et ''%%[[unlikely]]%%''. 
- 
-gcc est utilisé et les options d'optimisation doivent être activées au minimum niveau 1. 
- 
-<code asm> 
-f(int): 
-  mov     eax, edi 
-  cmp     edi, 1 
-  je      .L2 
-  cmp     edi, 2 
-  mov     edx, 3 
-  cmovne  eax, edx 
-.L2: 
-  ret 
-</code> 
- 
-Code généré avec les attributs ''%%[[likely]]%%'' et ''%%[[unlikely]]%%''. 
- 
-<code asm> 
-f(int): 
-  mov     eax, edi 
-  cmp     edi, 1 
-  je      .L2 
-  cmp     edi, 2 
-  jne     .L8 
-.L2: 
-  ret 
-.L8: 
-  mov     eax, 3 
-  ret 
-</code> 
lang/cpp/condition.1580791209.txt.gz · Dernière modification : 2020/02/04 05:40 de root