Tengo una estructura llamada log que tiene 13 caracteres. después de hacer un tamaño de (log) veo que el tamaño no es 13 sino 16. Puedo usar __attribute __ ((packed)) para obtener el tamaño real de 13, pero me pregunto si esto afectará el rendimiento del programa. Es una estructura que se usa con bastante frecuencia.¿Puede __tribuir __ ((empaquetado)) afectar el rendimiento de un programa?
Me gustaría poder leer el tamaño de la estructura (13 no 16). Podría usar una macro, pero si esta estructura cambia alguna vez, es decir, campos agregados o eliminados, me gustaría que el nuevo tamaño se actualice sin cambiar una macro porque creo que es propenso a errores. ¿Tienes alguna sugerencia?
La mayoría del hardware maneja la mayoría de las cargas desalineadas sin una penalización. La excepción a la regla es cuando el acceso abarca algún tipo de límite: línea de caché, página, etc. Las instrucciones de mención son engañosas. En particular, si el conjunto de trabajo no encaja en el caché (no es una situación inusual), el beneficio de menos transacciones de DRAM para un conjunto "comprimido" probablemente superará los accesos de caché adicionales. Doblemente para las estructuras escritas en el disco. – Potatoswatter
@Potatoswatter: "la mayoría"? Tal vez si "la mayoría de las máquinas son x86" su afirmación tiene alguna posibilidad de ser cierta, pero la última vez que verifiqué la mayoría de las máquinas son sistemas embebidos, teléfonos celulares, etc. En la mayoría de hardware, el acceso no alineado significa que el compilador debe generar código que realiza las cargas/almacena byte por byte, posiblemente con bitshifting y bitwise o para ensamblar valores, para trabajar con tipos más grandes. Esta es una gran penalización. –
@R: ARM pre-ARMv6 no admite desalineación, según Wikipedia. Aparte de eso, SPARC y DSP, la mayoría de las arquitecturas lo admiten. De todos modos, incluso el volcado de bytes tedioso realizado a la velocidad de la CPU puede no ser más lento que el tiempo de transferencia extra de disco/flash/DRAM. – Potatoswatter