Cada compilador de C ofrece la opción de "empaquetar" estructuras de C (por ejemplo __attribute__ ((__packed__))
, o #pragma pack()
). Ahora, todos sabemos que se requiere empacar, si queremos enviar o almacenar datos de manera confiable. Esto también debe haber sido un requisito desde los primeros días del lenguaje C.
Entonces, ¿por qué las estructuras empaquetadas no son parte de la especificación del lenguaje C? ¿Ni siquiera están en C99 o C11 a pesar de que la necesidad de tenerlos se conoce desde hace décadas? ¿Qué me estoy perdiendo? ¿Por qué es específico del compilador?
Respuestas:
Supongo que es porque depende de la combinación de CPU / compilador objetivo utilizado. Esto significa que es mejor ser una directiva compiladora (ya que está relacionada con eso) que un aspecto del lenguaje, porque ¿cómo especificar eso? La única forma en que podrían hacerlo es con la unión.
El artículo de Raymond da una idea de por qué esto es: http://www.catb.org/esr/structure-packing/
fuente
Hay tres factores principales.
Con estos factores en mente, tanto los compiladores estándar como todos los compiladores C / C ++ rellenan rutinariamente las estructuras para garantizar una alineación óptima para el procesador, pero también proporcionan mecanismos para anular esto si es necesario con fines de interoperabilidad.
Esto de ninguna manera es algo que se haya pasado por alto. Se entiende muy bien y la situación actual es por diseño. Las últimas versiones del estándar C ++ tienen un amplio soporte para manejar los problemas de alineación, que quizás no conozca.
fuente
Es específico del compilador porque no está en el estándar. Y no está en el estándar porque sería difícil de especificar de una manera que no requeriría mucho esfuerzo de implementación para compiladores de plataformas oscuras con restricciones de alineación forzadas.
Y ninguno de esos esfuerzos tiene mucha justificación, porque cada compilador / plataforma que le importa a cualquiera que use un compilador C89 o posterior ya lo ha implementado.
fuente
&
/|
operaciones de lectura / escritura de los valores de cada campo.