typedef avec un tableau au lieu d'utiliser un struct en C++
Trouvé intéressant d'utiliser un typedef que je n'ai vraiment pas voir la nécessité pour.
typedef int Color[3];
Alors l'utilisation serait:
Color pants;
pants[0] = 0;
etc.
À l'aide de la définition de type à travers ptrs a été la création d'étrange à la recherche du code qui n'était pas claire.
Pourquoi ne pas simplement utiliser un struct?
struct Color {
int r;
int g;
int b;
};
Color pants;
pants.r = 0;
etc.
Vous pouvez utiliser une union pour exprimer le var comme un ensemble ou individuellement, ce qui est bancale, mais encore que c'est en quelque sorte plus complexe qu'une seule valeur.
Quelqu'un peut-il offrir un aperçu quant au mérite de l'utilisation de typedef avais tableau vs struct?
Vous devez vous connecter pour publier un commentaire.
Pourrait être que la structure n'était pas aligné sur la façon dont l'original codeur voulu. c'était peut-être collier est de 16 ou 32 bits. La création de la matrice assure pas de la structure de rembourrage a lieu. A ce passé dans un conducteur ou à un périphérique matériel?
pragma
sEn utilisant un tableau est une mauvaise idée pour plusieurs raisons.
int[]
se désintègre àint *
quand utilisé dans la liste des paramètres.operator=
d'attribuer les tableaux.Soit
struct
ouboost::array
donnerait beaucoup mieux.Un avantage de plus de la struct forme: si jamais vous avez besoin de passer de la Couleur à une fonction et prendre sa taille:
Si vous utilisez le tableau de forme, c peut être interprétée comme une
Color *
(tableaux sont passés par l'intermédiaire d'un pointeur vers son premier élément) etsizeof(c)
sera égal àsizeof(int*)
. Été là, fait que, suis mordu il.Edit: la structure de la forme va se comporter comme (naïvement) attendu.
Vous souhaitez que le tableau de l'expression pour être en mesure de boucle.
Donc, si vous doit ont la
[rgb]
formes, vous utilisez une union, mais que fait plus saisissant.::sigh::
La possible rembourrage pourrait devenir un problème lors de l'utilisation d'un tableau de structures, comme vous pourriez avoir des problèmes de conversion entre ça et les objectifs attend serrées Rgb. Dans ce cas, assurez-vous que le rembourrage est exactement ce que vous attendez, à l'aide de
pragma pack()
par exemple.Si .x ou [] est le meilleur, vous pouvez surcharge
operator[]
pour la structure (à l'aide d'un commutateur dans ce cas). Tout bon compilateur d'optimiser cette équivalente àstatic_cast<int*>(this)[index]
, donc il n'y a aucune perte de performance. Bien sûr, vous pouvez aller avec l'union, mais il ne l'aide pas beaucoup. Une autre possibilité est de mettre en œuvre .x (), etc. en termes de [].De toute façon, je recommande l'utilisation de la structure, que vous n'avez pas perdre quoi que ce soit (vous pouvez toujours convertir un tableau de
Color
àint*
, mais vous pouvez écrire des algorithmes plus facile lors de la prise d'une struct que lors de la prise d'unint*
-- par exemple, si vous voulez la luminance, il est plus facile IMAO pour avoir un joli membre/une fonction prenant une Couleur au lieu d'un int*, parce qu'avec le type int, vous ne pouvez jamais être sûr qu'il s'agisse de RGB, RGBA, YoCoCg alors qu'avec la Couleur, vous pouvez la faire respecter.Dernier mais non le moins, une struct vous donne la possibilité d'initialiser tous les membres valides/sane/debug valeurs, si vous le souhaitez.
Je suppose que le tableau a été utilisé comme un n-uplet, de sorte que boost::tuple peut être considéré comme une alternative qui fait mieux apparaître l'intention.