2017-06-13 1 views
0

J'ai récemment commencé à utiliser des drapeaux pour gérer la condition de validité d'une boucle d'entrée afin qu'elle puisse être vérifiée ailleurs dans la boucle plutôt que d'avoir à refaire la même vérification plusieurs fois. Cependant, je ne sais pas comment attribuer le drapeau. Y a-t-il une pratique généralement standard à ce sujet, ou juste un style personnel? Quoi, les différences sont-elles dans le code compilé, le cas échéant?Existe-t-il une différence de compilateur entre un if-check et un conditionnel en ligne?

Par exemple, au lieu du code ci-dessous:

bool isValidSize; 

do { 
    std::cout << "Enter the font size (8-12): "; 
    std::cin >> fontSize; 

    if (fontSize >= MIN_FONT_SIZE && fontSize <= MAX_FONT_SIZE) { 
     isValidSize = true; 
    } else { 
     isValidSize = false; 
     std::cout << "Invalid size. "; 
    } 
} while (!isValidSize); 

l'instruction if peut être modifié pour le rendre plus clair ce que isValidSize est réglé sur un coup d'oeil:

isValidSize = (fontSize >= MIN_FONT_SIZE && fontSize <= MAX_FONT_SIZE); 
    if (!isValidSize) { 
     std::cout << "Invalid size. "; 
    } 

Serait-ce être compilé comme un if-check supplémentaire? Y a-t-il un avantage de portabilité à ce que l'affectation soit distincte de toute autre chose? D'après le code, il semble que l'avantage de la première voie est probablement une seule branche, mais une affectation supplémentaire par représentant et a également un autre?

+1

Vous pouvez facilement vérifier ce que les différents compilateurs génèrent avec différentes options d'optimisation sur https://godbolt.org/. Mais, dans tous les cas, avant d'essayer d'optimiser, vous devriez comparer/profiler le code pour voir si cela a de l'importance - et sinon, toujours écrire la version la plus claire. –

+1

Ce type de micro-optimisation est presque toujours bête. Écrivez-le de la façon qui a le plus de sens pour un lecteur. Laissez le compilateur faire son travail. Gcc est très bon pour optimiser les cas comme celui-ci. Si vous êtes curieux, c'est une compétence intéressante d'apprendre à compiler à assembler (facile) et regarder ce qui se passe pour vous-même (un peu plus difficile). Ensuite, réalisez que deux compilateurs ne se ressemblent pas, y compris les versions du même compilateur. @JesperJuhl a raison sur godbolt.org. C'est vraiment cool. – Gene

+0

Il ne sert à rien de s'inquiéter des nanosecondes dans une boucle d'entrée interactive. Utilisez celui que vous trouvez le plus lisible. – molbdnilo

Répondre

1

Il n'y a aucune différence: proof.

Testé sur GCC 6.3 avec des optimisations (-O3).

Optez pour ce que vous pensez être le plus lisible.

+0

Merci! Est-ce que l'un d'entre eux est plus standard en ce qui concerne la lisibilité de la pratique générale ou est-ce que cela n'a vraiment aucune importance? – BrainFRZ

+0

@BrainFRZ Dans ce cas, cela dépend vraiment. Quoi qu'il en soit, je préfère le deuxième extrait. Je le trouve plus lisible. –