lang:cpp:condition
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
lang:cpp:condition [2020/02/17 06:31] – Séparation du C / C++ root | lang:cpp:condition [2020/06/16 15:15] (Version actuelle) – Fix typo root | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====if==== | ====if==== | ||
- | ===fold (opérateur ...)=== | + | |
+ | Les '' | ||
+ | |||
+ | ===Conditions multiples sur une même valeur : fold (opérateur ...)=== | ||
Avec les templates variadiques : | Avec les templates variadiques : | ||
Ligne 21: | Ligne 24: | ||
[[https:// | [[https:// | ||
- | ====[[unlikely]] et [[likely]]==== | + | ====switch/case==== |
- | Il est possible d' | + | |
- | <code cpp> | + | Les '' |
- | int i = 1; | + | |
- | if (i == 1) [[likely]] | + | ===Déclaration d'une variable dans un switch=== |
- | ... | + | Une variable définie dans un '' |
- | </ | + | |
+ | Il est donc conseillé de mettre des '' | ||
<code cpp> | <code cpp> | ||
- | int f(int i) | + | class A |
{ | { | ||
- | | + | public: |
+ | A() = default; | ||
+ | }; | ||
+ | |||
+ | class B | ||
+ | { | ||
+ | public: | ||
+ | B(){} | ||
+ | }; | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int i = 0; | ||
+ | | ||
+ | { | ||
+ | case 0: | ||
+ | // Valide car la classe A a un constructeur default. | ||
+ | A a; | ||
+ | // Non car si i 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: return 1; | + | |
- | | + | B b2; |
- | case 2: return 2; | + | |
- | | + | } |
- | | + | |
+ | | ||
+ | | ||
} | } | ||
- | return 2; | ||
} | } | ||
</ | </ | ||
- | Code généré sans les attributs | + | ===Sur un string=== |
+ | '' | ||
- | gcc est utilisé et les options d' | + | <code cpp> |
+ | constexpr unsigned long djb2(char const *str) | ||
+ | { | ||
+ | unsigned long hash = 5381; | ||
+ | int c = 0; | ||
- | <code asm> | + | while ((c = *str++)) |
- | f(int): | + | hash = ((hash |
- | mov eax, edi | + | |
- | cmp edi, 1 | + | |
- | je .L2 | + | |
- | cmp edi, 2 | + | |
- | mov edx, 3 | + | |
- | cmovne | + | |
- | .L2: | + | |
- | ret | + | |
- | </code> | + | |
- | Code généré avec les attributs '' | + | return hash; |
+ | } | ||
- | <code asm> | + | int main() |
- | f(int): | + | { |
- | | + | |
- | | + | |
- | | + | |
- | | + | case djb2(" |
- | | + | texte = " |
- | .L2: | + | |
- | ret | + | |
- | .L8: | + | } |
- | | + | |
- | ret | + | |
</ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | Toute création d'un hash présente un risque de collision. | ||
+ | </ | ||
+ |
lang/cpp/condition.1581917508.txt.gz · Dernière modification : 2020/02/17 06:31 de root