Oui, c'est possible. Par exemple, pour gcc
vous pouvez utiliser __builtin_unreachable
de dire au compilateur conditions impossibles, comme suit:
if (value < 0 || value > 36) __builtin_unreachable();
Nous pouvons conclure que la condition ci-dessus dans une macro:
#define assume(cond) do { if (!(cond)) __builtin_unreachable(); } while (0)
Et de l'utiliser comme ceci:
assume(x >= 0 && x <= 10);
Comme vous pouvez le voir, gcc
effectue des optimisations basées sur cette information:
#define assume(cond) do { if (!(cond)) __builtin_unreachable(); } while (0)
int func(int x){
assume(x >=0 && x <= 10);
if (x > 11){
return 2;
}
else{
return 17;
}
}
Produit:
func(int):
mov eax, 17
ret
Un inconvénient, cependant, que si votre code jamais de pauses, ces hypothèses, vous obtenez un comportement indéfini.
Il n'est pas de vous avertir lorsque cela se produit, même dans les versions de débogage. Debug/test/repérer les bugs, avec des hypothèses plus facilement, vous pouvez utiliser un hybride suppose/macro assert (crédits de @David Z), comme ceci:
#if defined(NDEBUG)
#define assume(cond) do { if (!(cond)) __builtin_unreachable(); } while (0)
#else
#include <cassert>
#define assume(cond) assert(cond)
#endif
Dans les versions debug (avec NDEBUG
non défini), il fonctionne comme un vulgaire assert
, message d'erreur d'impression et d' abort
'ing programme, et dans les versions release il fait usage d'une hypothèse, la production de code optimisé.
Notez, cependant, que ce n'est pas un substitut pour les réguliers, assert
- cond
reste dans les versions release, donc vous ne devriez pas faire quelque chose comme assume(VeryExpensiveComputation())
.