Saltar al contenido

Alineación de memoria en estructuras C

Nuestro equipo de trabajo ha estado largas horas buscando la solución a tus interrogantes, te compartimos la respuestas así que nuestro deseo es servirte de mucha apoyo.

Solución:

Al menos en la mayoría de las máquinas, un tipo solo se alinea con un límite tan grande como el propio tipo. [Edit: you can’t really demand any “more” alignment than that, because you have to be able to create arrays, and you can’t insert padding into an array]. En su implementación, short aparentemente es de 2 bytes, y int 4 bytes.

Eso significa que su primera estructura está alineada con un límite de 2 bytes. Dado que todos los miembros tienen 2 bytes cada uno, no se inserta relleno entre ellos.

El segundo contiene un elemento de 4 bytes, que se alinea con un límite de 4 bytes. Dado que está precedido por 6 bytes, se insertan 2 bytes de relleno entre v3 y i, dando 6 bytes de datos en el shorts, dos bytes de relleno y 4 bytes más de datos en el int para un total de 12.

Olvídese de tener diferentes miembros, incluso si escribe dos estructuras cuyos miembros son exactamente lo mismo con una diferencia es que el orden en que se declaran es diferente, entonces el tamaño de cada estructura puede ser (y a menudo es) diferente.

Por ejemplo, mira esto,

#include 
using namespace std;
struct A

   char c;
   char d;
   int i; 
;
struct B

   char c;
   int i;   //note the order is different!
   char d;
;
int main() 
        cout << sizeof(A) << endl;
        cout << sizeof(B) << endl;

compilarlo con gcc-4.3.4, y obtienes este resultado:

8
12

Es decir, los tamaños son diferentes aunque ambas estructuras tengan los mismos miembros.

Código en Ideone: http://ideone.com/HGGVl

La conclusión es que el Estándar no habla sobre cómo se debe hacer el relleno, por lo que los compiladores son libres de tomar cualquier decisión y usted no puede suponga que todos los compiladores toman la misma decisión.

De forma predeterminada, los valores se alinean según su tamaño. Así que un valor de 2 bytes como un short está alineado en un límite de 2 bytes y un valor de 4 bytes como un int está alineado en un límite de 4 bytes

En su ejemplo, se agregan 2 bytes de relleno antes i para asegurar eso i cae en un límite de 4 bytes.

(Toda la estructura está alineada en un límite al menos tan grande como el valor más grande de la estructura, por lo que su estructura se alineará en un límite de 4 bytes).

Las reglas reales varían según la plataforma: la página de Wikipedia sobre la alineación de la estructura de datos tiene más detalles.

Los compiladores generalmente le permiten controlar el empaque a través de (por ejemplo) #pragma pack directivas.

Sección de Reseñas y Valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *