Asignación de memoria de estructura IOS
1. El desplazamiento de cada miembro de la estructura con respecto a la primera dirección de la estructura es un múltiplo entero del tamaño del miembro. El compilador agregará bytes de relleno entre miembros si es necesario.
2. El tamaño total de la estructura es un múltiplo entero del tamaño del miembro más ancho de la estructura.
3. La primera dirección de una variable de estructura se puede dividir uniformemente por el tamaño de su miembro de tipo básico más ancho.
4. Para una estructura compuesta que tiene variables de estructura en sus atributos de miembro de estructura, los miembros secundarios del miembro de tipo compuesto deben incluirse al determinar el miembro de tipo básico más amplio. Sin embargo, al determinar la posición desplazada de miembros de tipo compuesto, el tipo compuesto se trata como un todo.
5. Resumen: El tamaño de la estructura es igual al desplazamiento del último miembro más su tamaño más el número de bytes de relleno al final, es decir: tamaño de (estructura) = desplazamiento de (último). elemento) sizeof (último elemento) sizeof (relleno de cola).
Ejemplo 1:
El desplazamiento del primer miembro desde la primera dirección de la estructura es 0, que es un múltiplo entero del miembro int i (longitud 4).
El desplazamiento del segundo miembro de la estructura desde la primera dirección es 4, que es un múltiplo entero del miembro char c (longitud 1). (Debido a que el tamaño total de la estructura es un número entero de bits del tamaño del miembro más ancho de la estructura, si la estructura tuviera solo estos dos miembros, se agregarían tres bytes de relleno después del carácter c, pero ahora hay tres miembros, por lo que no se necesita relleno)
El desplazamiento del tercer miembro con respecto a la primera dirección de la estructura es 5, que no es un múltiplo entero del miembro int x, por lo que se rellenan tres palabras. antes de la sección x (o después de c) para que el desplazamiento de x llegue a 8, que es un múltiplo entero de 4. Entonces el tamaño de la memoria de esta estructura es 4 1 3 4.
Ejemplo 2: Cada tipo de miembro tiene el mismo número de miembros, pero el orden es diferente y el tamaño de la memoria también es diferente.
Ejemplo 3: estructura compuesta
# pragma pack(n) //El compilador alinea el botón con n bytes y establece el tamaño de miembro más ancho de la estructura (menos que el tamaño de miembro más ancho real tamaño de miembro) tamaño de miembro ancho). Es decir, la longitud final de la estructura es un múltiplo entero de n.
# pragma pack() //Cancelar alineación personalizada.
# pragma pack(puch, 1) //Guarda la alineación original y establece una nueva alineación.
# pragma pack(pop) //Restaura el estado de alineación previamente guardado.
El parámetro #pragma pack debe ser "1", "2", "4", "8" o "16"
El parámetro #pragma pack esperado es "1 ", "2", "4", "8" o "16".
Demostración
Cálculo de memoria después de configurar la alineación
1 Cuando la longitud de alineación establecida es menor que la longitud del miembro actual, el desplazamiento del miembro es un múltiplo entero de. la longitud del miembro.
2. Cuando la longitud de alineación establecida es mayor que la longitud del miembro actual y menor que la longitud del miembro más largo, el desplazamiento del miembro es un múltiplo entero de la longitud de alineación establecida.
3. Cuando la longitud de alineación establecida es mayor que la longitud del miembro más largo, el desplazamiento del miembro se alineará según el tamaño real del miembro actual.
4. Cuando la longitud de alineación establecida es menor que la longitud real del miembro más largo, la longitud de la estructura es un múltiplo entero de la longitud de alineación establecida.
5. Cuando la longitud de alineación establecida es mayor o igual a la longitud real del miembro más largo, la longitud de la estructura es un múltiplo entero de la longitud real del miembro más largo.