L’arrivée du C++17 – std::byte

Bonjour à tous et bienvenue sur cet article, de la série L’arrivée de C++17, consacré cette fois ci à std::byte.

La p0298r3 introduit un nouveau type std::byte , définit dans le header <cstddef>, qui n’est ni un caractère, ni un entier.

std::byte , tout comme char et unsigned char, peut être utilisé pour représenter des séquences mémoire. Cependant,  std::byte a la particularité de priver d’un certain nombre de conversions implicites indésirables lorsqu’on veut vraiment voir la mémoire comme une plage de bytes plutôt que comme des caractères ou des entiers.

Opérations sur std::byte

std::byte propose un nombre limité d’opérations. Le type propose les opérations bit à bit mais pas les opérations arithmétiques, puisqu’il ne s’agit pas d’un type entier. Les opérations suivantes sont disponibles sur std::byte :

  • Les opérateurs de décalages :
    • std::byte operator<<(std::byte, IntegerType shift)
    • std::byte operator>>(std::byte, IntegerType shift)
  • Les opérateurs d’affectation par décalage :
    • std::byte& operator<<=(std::byte&, IntegerType shift)
    • std::byte& operator>>=(std::byte&, IntegerType shift)
  • Les opérateurs logiques bit à bit :
    •   std::byte operator|(std::byte, std::byte)
    • std::byte operator&(std::byte, std::byte)
    • std::byte operator^(std::byte, std::byte)
    • std::byte operator~(std::byte, std::byte)
  • Les opérateurs d’affectation :
    • std::byte& operator|(std::byte&, std::byte)
    • std::byte& operator&(std::byte&, std::byte)
    • std::byte& operator^(std::byte&, std::byte)
  • IntegerType to_integer(std::byte b)

La fonction template  std::to_integer permet de convertir un  std::byte en un type entier, elle correspond à une simple conversion.

Les opérations arithmétiques et les conversions vers des types entiers ou caractères sont évitées par std::byte.

Usage de std::byte

std::byte est destiné à être utilisé lorsqu’on souhaite manipuler des séquences de bytes sans leur prêter de signification. Si vous voulez traiter une suite d’entiers ou de caractères, les bons vieux char et unsigned char restent à privilégier.

Si vous n’avez pas de sémantique particulière associée aux traitements des bytes, alors  std::byte offre la possibilité de manipuler des bytes sans risquer des traitements réservés aux entiers ou aux caractères qui pourraient arriver après des conversions implicites ou un manque d’attention.

À ce titre, l’usage de  std::byte est assez occasionnel mais peut apporter des garanties intéressantes. Cette sémantique particulière enlève le risque d’integer overflow par exemple, ce qui peut donner des informations aux analyseurs statiques ou à l’optimiseur.

Références et ressources

%d bloggers like this: