Tuve exactamente el caso en nuestra biblioteca. Teníamos un módulo genérico de mapeo de cadenas que podía usar diferentes tamaños para el índice, 8, 16 o 32 bits (por razones históricas). Entonces el código estaba lleno de código así:
if(map->idxSiz == 1)
return ((BYTE *)map->idx)[Pos] = ...whatever
else
if(map->idxSiz == 2)
return ((WORD *)map->idx)[Pos] = ...whatever
else
return ((LONG *)map->idx)[Pos] = ...whatever
Había 100 líneas así. En un primer paso, lo cambié de unión y descubrí que era más legible.
switch(map->idxSiz) {
case 1: return map->idx.u8[Pos] = ...whatever
case 2: return map->idx.u16[Pos] = ...whatever
case 3: return map->idx.u32[Pos] = ...whatever
}
Esto me alowed para ver mejor lo que estaba pasando y entonces podría decidir eliminar por completo el uso de idxSiz variantes de sólo 32 bits índices. Pero esto solo fue posible una vez que el código se volvió más legible. PD: Eso fue solo una parte menor de nuestro proyecto, que se trata de varios cientos de miles de líneas de código escritas por personas que ya no existen. Entonces los cambios en el código son graduales para no romper las aplicaciones.
Conclusión: Incluso si las personas están menos acostumbradas a la variante de unión, la prefiero porque puede hacer que el código sea mucho más ligero de leer. En proyectos grandes, es extremadamente importante hacer que el código sea más legible, incluso si es usted quien lo leerá más adelante.
Editar: Se ha añadido el comentario, como comentarios no formato de código:
El cambio de interruptor de vino antes (esto es ahora el código real como lo fue)
switch(this->IdxSiz) {
case 2: ((uint16_t*)this->iSort)[Pos-1] = (uint16_t)this->header.nUz; break;
case 4: ((uint32_t*)this->iSort)[Pos-1] = this->header.nUz; break;
}
fue cambiado a
switch(this->IdxSiz) {
case 2: this->iSort.u16[Pos-1] = this->header.nUz; break;
case 4: this->iSort.u32[Pos-1] = this->header.nUz; break;
}
que no debería haber combinado las embellecimiento que hice en el código y sólo muestro ese paso.Pero publiqué mi respuesta desde mi casa donde no tuve acceso al código
Disculpe el cliché, pero el tamaño importa :) –
@tinkertim y las probabilidades son de que sean del mismo tamaño. En un sistema Intel de 32 bits, ambos tomarán 4 bytes. técnicamente, void * podría ser más grande, pero casi nunca lo será (a menos que double * sea más grande ...) – Mikeage
¿No son todos los punteros del mismo tamaño, independientemente del tipo de datos que señalan? –