[c++] Puis-je suggérer l'optimiseur en donnant la plage d'un nombre entier?



1 Answers

Il existe un support standard pour cela. Ce que vous devez faire est d'inclure stdint.h ( cstdint ) et ensuite utiliser le type uint_fast8_t .

Cela indique au compilateur que vous n'utilisez que des nombres entre 0 et 255, mais qu'il est libre d'utiliser un type plus grand si cela donne un code plus rapide. De même, le compilateur peut supposer que la variable n'aura jamais une valeur supérieure à 255 et ensuite effectuer des optimisations en conséquence.

Question

J'utilise un type int pour stocker une valeur. Par la sémantique du programme, la valeur varie toujours dans un très petit intervalle (0 - 36), et int (pas un caractère) est utilisé uniquement en raison de l'efficacité du processeur.

Il semble que de nombreuses optimisations arithmétiques spéciales peuvent être effectuées sur un si petit nombre d'entiers. De nombreux appels de fonctions sur ces entiers peuvent être optimisés dans un petit ensemble d'opérations "magiques", et certaines fonctions peuvent même être optimisées dans les recherches de tables.

Donc, est-il possible de dire au compilateur que cet int est toujours dans cette petite plage, et est-il possible pour le compilateur de faire ces optimisations?




Je suis juste en train de dire que si vous voulez une solution qui est plus standard en C ++, vous pouvez utiliser l'attribut [[noreturn]] pour écrire votre propre unreachable .

Donc, je vais re- démontrer l' excellent exemple de Deniss pour démontrer:

namespace detail {
    [[noreturn]] void unreachable(){}
}

#define assume(cond) do { if (!(cond)) detail::unreachable(); } while (0)

int func(int x){
    assume(x >=0 && x <= 10);

    if (x > 11){
        return 2;
    }
    else{
        return 17;
    }
}

Ce qui, comme vous pouvez le voir , donne un code presque identique:

detail::unreachable():
        rep ret
func(int):
        movl    $17, %eax
        ret

L'inconvénient est bien sûr, que vous obtenez un avertissement qu'une fonction [[noreturn]] fait, en effet, revenir.






Related