sintaxis - ¿Cómo encuentro el tamaño de una estructura?
sizeof() c++ (8)
Al contrario de lo que han dicho otras respuestas, en la mayoría de los sistemas, en ausencia de una opción pragma o compilador, el tamaño de la estructura será de al menos 6 bytes y, en la mayoría de los sistemas de 32 bits, 8 bytes. Para sistemas de 64 bits, el tamaño podría ser fácilmente de 16 bytes. La alineación entra en juego; siempre. El tamaño de una única estructura debe ser tal que se pueda asignar una matriz de esos tamaños y los miembros individuales de la matriz estén suficientemente alineados para el procesador en cuestión. En consecuencia, si el tamaño de la estructura era 5 como otros han hipotetizado, entonces una matriz de dos de tales estructuras tendría 10 bytes de longitud, y el puntero char en el segundo miembro de la matriz estaría alineado en un byte impar, lo que (en la mayoría procesadores) causan un cuello de botella importante en el rendimiento.
struct a
{
char *c;
char b;
};
¿Qué es sizeof (a)?
El tamaño de la estructura debe ser de 8 bytes en un sistema de 32 bits, de modo que el tamaño de la estructura se multiplique por 2. Esto hace que las estructuras individuales estén disponibles en los límites de bytes correctos cuando se declara una matriz de estructuras. Esto se logra rellenando la estructura con 3 bytes al final.
Si la estructura tenía el puntero declarado después del carácter, seguiría teniendo un tamaño de 8 bytes, pero el relleno de 3 bytes se habría agregado para mantener el puntero (que es un elemento de 4 bytes) alineado en un límite de dirección de 4 bytes.
La regla de oro es que los elementos deben estar en un desplazamiento que es el múltiplo de su tamaño de byte y la estructura en sí debe ser de un tamaño que es un múltiplo de 2.
El valor exacto es sizeof (a) .
También puede correr un riesgo y asumir que en este caso es no menos de 2 y no más de 16.
Esto variará según su arquitectura y cómo trata los tipos de datos básicos. También dependerá de si el sistema requiere una alineación natural.
Si desea contarlo manualmente, el tamaño de una estructura es solo el tamaño de cada uno de sus miembros de datos después de considerar la alineación. No hay bytes de sobrecarga mágicos para una estructura.
Sospecho que te refieres a ''struct'', no ''strict'' y ''char'' en lugar de ''Char''.
El tamaño dependerá de la implementación. En la mayoría de los sistemas de 32 bits, probablemente serán 5 - 4 bytes para el puntero, uno para el char. No creo que la alineación entre en juego aquí. Sin embargo, si cambió ''c'' y ''b'', el tamaño puede crecer a 8 bytes.
Ok, lo probé (g ++ 4.2.3, con la opción -g) y obtengo 8.
Supongo que te refieres a struct y no terminante, pero en un sistema de 32 bits será de 5 u 8 bytes, dependiendo de si el compilador está rellenando la estructura.
#include <stdio.h>
typedef struct { char* c; char b; } a;
int main()
{
printf("sizeof(a) == %d", sizeof(a));
}
Obtengo "sizeof (a) == 8" en una máquina de 32 bits. El tamaño total de la estructura dependerá del embalaje: en mi caso, el empaque predeterminado es 4, por lo que ''c'' toma 4 bytes, ''b'' toma un byte, dejando 3 bytes de relleno para llevarlo al siguiente múltiplo de 4 : 8. Si desea modificar este empaque, la mayoría de los compiladores tienen una forma de alterarlo, por ejemplo, en MSVC:
#pragma pack(1)
typedef struct { char* c; char b; } a;
da sizeof (a) == 5. ¡Si hace esto, tenga cuidado de restablecer el embalaje antes de cualquier encabezado de biblioteca!