tamaño de la estructura en C [duplicate]

4 minutos de lectura

Posible duplicado:

¿Por qué sizeof para una estructura no es igual a la suma de sizeof de cada miembro?

Considere el siguiente código C:

#include <stdio.h>    

struct employee
{
  int id;
  char name[30];  
};

int main()
{
  struct employee e1;      
  printf("%d %d %d", sizeof(e1.id), sizeof(e1.name), sizeof(e1));
  return(0);
}

La salida es:

4 30 36

¿Por qué el tamaño de la estructura no es igual a la suma de los tamaños de sus variables componentes individuales?

  • Puede usar el atributo empaquetado en gcc. Esto eliminará el relleno y mantendrá la estructura lo más pequeña posible. estructura prueba_t { int c; } atributo__((__empaquetado));

    – eaanon01

    3 de diciembre de 2009 a las 18:57

  • Duplicado de (al menos) stackoverflow.com/questions/119123/…

    – dmckee — gatito ex-moderador

    3 de diciembre de 2009 a las 19:09

  • eaanon01. no debe decirle a nadie sobre algo tan inportable como el paquete de atributos a menos que haya una muy buena razón y se entiendan todas las implicaciones.

    –Peter Joot

    3 de diciembre de 2009 a las 19:12

  • Ver también: stackoverflow.com/questions/833526/… y stackoverflow.com/questions/143025/…

    – dmckee — gatito ex-moderador

    3 de diciembre de 2009 a las 19:16

  • Consulte estas preguntas frecuentes de C sobre la alineación de la memoria. c-faq.com/struct/align.esr.html

    – Richard Cámaras

    26 de abril de 2013 a las 12:37

avatar de usuario
miguel rebabas

El compilador puede agregar relleno para los requisitos de alineación. Tenga en cuenta que esto se aplica no solo al relleno entre los campos de una estructura, sino que también se puede aplicar al final de la estructura (para que las matrices del tipo de estructura tengan cada elemento correctamente alineado).

Por ejemplo:

struct foo_t {
    int x;
    char c;
};

A pesar de c campo no necesita relleno, la estructura generalmente tendrá un sizeof(struct foo_t) == 8 (en un sistema de 32 bits – en lugar de un sistema con un 32 bits int tipo) porque tendrá que haber 3 bytes de relleno después de la c campo.

Tenga en cuenta que es posible que el sistema no requiera el relleno (como x86 o Cortex M3), pero los compiladores aún pueden agregarlo por razones de rendimiento.

  • +1, aunque alinear a 6 bytes suena raro. Sin embargo, tal vez estoy un poco atrasado en cosas de bajo nivel.

    – Michael Krelin – hacker

    3 de diciembre de 2009 a las 18:25

  • Bueno, el nombre comienza en el desplazamiento 4 (bastante plausible) y se extiende hasta 34. 34 no es un múltiplo de 4, por lo que se completa con 36, que es 9*4. ¡Tiene sentido para mi!

    -Carl Smotricz

    3 de diciembre de 2009 a las 18:27

  • Se está alineando con los límites de 32 bits (4,8,16,24,32,36,…)

    – Mordachai

    3 de diciembre de 2009 a las 18:27

  • No se está alineando a 6 bytes. int está tomando 4 bytes y char[30] está tomando 32 bytes, ambos múltiplos de 4, lo que hace que el tamaño de la estructura sea también un múltiplo de 4 bytes.

    – Sinan Ünür

    3 de diciembre de 2009 a las 18:28

  • Ah, eso tiene mucho sentido.

    – Michael Krelin – hacker

    3 de diciembre de 2009 a las 18:28

Como se mencionó, el compilador de C agregará relleno para los requisitos de alineación. Estos requisitos a menudo tienen que ver con el subsistema de memoria. Algunos tipos de computadoras solo pueden acceder a la memoria alineada con algún valor “agradable”, como 4 bytes. Esto es a menudo lo mismo que la longitud de la palabra. Por lo tanto, el compilador de C puede alinear campos en su estructura con este valor para que sean más fáciles de acceder (por ejemplo, los valores de 4 bytes deben estar alineados con 4 bytes). Además, puede rellenar la parte inferior de la estructura para alinear los datos que siguen a la estructura. . Creo que hay otras razones también. Se puede encontrar más información en esta pagina de wikipedia

Su alineación predeterminada es probablemente de 4 bytes. O el elemento de 30 bytes obtuvo 32, o la estructura en su conjunto se redondeó al siguiente intervalo de 4 bytes.

Alinear a 6 bytes no es raro, porque se alinea a direcciones múltiples a 4.

Básicamente, tiene 34 bytes en su estructura y la siguiente estructura debe colocarse en la dirección, que es múltiplo de 4. El valor más cercano después de 34 es 36. Y esta área de relleno cuenta en el tamaño de la estructura.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad