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/19 22:08] – code cpp rootlang:cpp:condition [2020/06/16 15:15] (Version actuelle) – Fix typo root
Ligne 1: Ligne 1:
 ====if==== ====if====
 +
 +Les ''if'' peuvent s'optimiser avec les attributs [[lang:cpp:attribut#unlikely_et_likely|unlikely et likely]].
 +
 ===Conditions multiples sur une même valeur : fold (opérateur ...)=== ===Conditions multiples sur une même valeur : fold (opérateur ...)===
 Avec les templates variadiques : Avec les templates variadiques :
Ligne 22: Ligne 25:
  
 ====switch/case==== ====switch/case====
 +
 +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=== ===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''.+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''. Il est donc conseillé de mettre des ''{}'' entre chaque ''case''.
Ligne 47: Ligne 52:
   {   {
   case 0:   case 0:
 +    // Valide car la classe A a un constructeur default.
     A a;     A a;
     // Non car si i vaut 1, le constructeur b ne sera pas appelé.     // Non car si i vaut 1, le constructeur b ne sera pas appelé.
Ligne 92: 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>
  
-====[[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.1582146527.txt.gz · Dernière modification : 2020/02/19 22:08 de root