Bonjour,
J'écris un driver pour un micro-contrôleur doté de très peu de RAM et je suis donc très préoccupé par le non-gaspillage de mémoire.
Le driver est sous la forme d'une classe.
À l'intérieur, j'ai un grand nombre d'étiquettes pour nommer des valeurs comme par exemple des adresses de registres et des numéros de bits.
Je peux utiliser le préprocesseur avec des #define. C'est la méthode classique, mais ça pose le problème de devoir gérer l'unicité des étiquettes. Je peux utiliser des enum mais ça suppose que toutes les étiquettes d'un même enum ont des valeurs différentes, ce qui est parfois une contrainte. Ou bien je peux déclarer des attributs privés en static constexpr…
…sauf que j'ai un doute.
est-ce que la constexpr est vraimment évaluée à la compilation et remplacée lors des appels comme si on passait une valeur immédiate ?
Autrement dit, est-ce que ça produit les mêmes opcodes qu'avec un #define ou des valeurs immédiates ?
Ou bien est-ce que c'est géré comme une variable const, c'est à dire constant mais avec tout de même l'allocation d'une adresse de stockage en RAM ?
D'après les essais que j'ai fait, il semble que la constexpr soit bien équivalente à une valeur immédiate prise en ROM. Mais ce que j'ignore, c'est si c'est garanti ou pas, ou bien si c'est spécifique à GCC, cette architecture ou bien mes options de compilation
Partager