J'ai une application Arduino (en fait une bibliothèque) qui contient un certain nombre de drapeaux d'état - et à l'origine je les ai simplement déclarés comme ints (bien uint8_t donc 8 bits non signés). Mais j'aurais pu les combiner tous en un entier et utiliser les opérations de masque de bits pour définir et tester le statut.Réglage de bit et lisibilité de code
Un exemple de l'ancien:
if (_shift == HIGH)
{
_shift = LOW;
}
else
{
_shift = HIGH;
}
un exemple de ce dernier
#define SHIFT_BIT 0
if (bitRead(_flags, SHIFT_BIT) == HIGH)
{
bitWrite(_flags, SHIFT_BIT, LOW);
}
else
{
bitWrite(_flags, SHIFT_BIT, HIGH);
}
L'ancien lit mieux, mais celui-ci est plus efficace (l'espace et le temps). L'efficacité de l'espace et du temps devrait-elle toujours être gagnante dans cette situation ou s'agit-il d'une sorte d'optimisation qui ne devrait avoir lieu qu'en cas de besoin?
(Ajouté)
Pour être complet est ici la définition de câblage de ces bitWrite etc. macros:
#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
Je suis d'accord avec la plupart de ce dans le cas où il y a peu de cas de la classe. Mais (a) il parle comme si c'était inouï de créer 1000 instances d'une structure, et (b) les avantages de l'atomicité naturelle des mots sont douteux. Un champ où votre code multithread repose sur des lectures et des écritures atomiques, mais n'a jamais besoin d'une mise à jour atomique, est considérablement plus rare qu'une structure avec 1000 instances. Et dans la plupart des cas, il se cassera dès que vous le déplacerez dans une architecture sans cohérence de cache. –
Je vais jeter un oeil à la référence, merci. Dans ce cas (c'est une classe générale gérant une combinaison bouton/led) je ne pourrais pas imaginer instancier plus de 20 mais le point sur 1000 instances est juste sur mais pas dans ce cas particulier ... –
(Plus tard après l'avoir lu) . C'est un bon article. La bonne chose est que je peux mesurer directement cela en regardant l'empreinte mémoire de l'application cible et l'utilisation de la mémoire associée. Dans la puce que je cible, j'ai seulement 2k de RAM disponible pour les "variables" mais 30k pour le programme. Donc, réduire le premier en augmentant ce dernier peut être un bon compromis ... –