Tengo experiencia en C #. Soy muy novato en un lenguaje de bajo nivel como C.
En C #, struct
el compilador distribuye la memoria de forma predeterminada. El compilador puede reordenar los campos de datos o rellenar bits adicionales entre campos de forma implícita. Entonces, tuve que especificar algún atributo especial para anular este comportamiento para un diseño exacto.
AFAIK, C no reordena ni alinea el diseño de la memoria de a struct
de forma predeterminada. Sin embargo, escuché que hay una pequeña excepción que es muy difícil de encontrar.
¿Cuál es el comportamiento del diseño de memoria de C? ¿Qué se debe reordenar / alinear y no?
fuente
#pragma pack
pero con un control más detallado sobre la semántica._Alignas
.Es específico de la implementación, pero en la práctica la regla (en ausencia
#pragma pack
o similar) es:sizeof(T)
bytes.Entonces, dada la siguiente estructura:
struct ST { char ch1; short s; char ch2; long long ll; int i; };
ch1
está en offset 0s
en el desplazamiento 2ch2
está en el desplazamiento 4, inmediatamente después de sll
en el desplazamiento 8i
está en el desplazamiento 16, justo después de llTambién lo
sizeof(ST)
es 24.Se puede reducir a 16 bytes reorganizando los miembros para evitar el relleno:
struct ST { long long ll; // @ 0 int i; // @ 8 short s; // @ 12 char ch1; // @ 14 char ch2; // @ 15 } ST;
fuente
char
miembro final a su ejemplo.sizeof(T)
bytes. Por ejemplo,double
en arquitecturas comunes de 32 bits es de 8 bytes, pero a menudo solo requiere una alineación de 4 bytes . Además, el relleno al final de la estructura solo se adapta a la alineación del miembro de estructura más ancho. Por ejemplo, una estructura de 3 variables de caracteres podría no tener relleno.Puede comenzar leyendo el artículo de Wikipedia sobre alineación de la estructura de datos para comprender mejor la alineación de datos.
Del artículo de wikipedia :
De 6.54.8 Pragmas de empaquetado de estructuras de la documentación de GCC:
fuente