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 agrega 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 con variables de estructura en los atributos del miembro de la estructura, al determinar el miembro de tipo básico más amplio, se deben incluir los submiembros del miembro de tipo compuesto. 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: sizeof (struct) = offsetof (último elemento). ) + tamaño de (último elemento) + tamaño de (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 del tamaño del miembro más ancho de la estructura, si la estructura tuviera solo estos dos miembros, entonces 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 bytes antes de x. (o después de c), de modo que x El desplazamiento llega a 8, que se convierte en 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 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 (para que sea más pequeño que el real (cualquiera que sea el tamaño de miembro más 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 la 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á de acuerdo con 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.