Cómo calcular el valor de sizeof (struct) en C


Mejor respuesta

La secuencia exacta sizeof(struct) es un error de compilación en C. Supongo que está preguntando cómo determina el tamaño de una particular struct.

Esa respuesta es no proporcionada directamente por la definición del lenguaje C. Más bien, es una función del ABI para su arquitectura de destino particular. (ABI significa Application Binary Interface).

El estándar del lenguaje C establece algunas reglas generales. Por ejemplo, si tienes un struct con varios miembros, el primer miembro compartirá una dirección con el struct y los miembros siguientes estar en direcciones superiores.

Los campos de bits tienen su propio conjunto de reglas. No los recapitularé aquí.

Para un primer pedido, el tamaño de un struct será al menos tan grande como la suma del tamaño de sus miembros (ignorando los campos de bits por el momento). Los miembros pueden tener restricciones de alineación y, si las tienen, el entorno puede introducir un relleno entre los miembros y un relleno al final de struct.

Considere lo siguiente struct en una arquitectura que requiere una alineación de 8 bytes para double valores:

struct fun {

char a;

double b;

char c;

};

Según las reglas del lenguaje C, b debe estar en una dirección superior a a en cualquier instancia de struct fun. Del mismo modo, c debe estar en una dirección más alta que b.

Como resultado, esta estructura en particular probablemente ocupa 24 bytes, debido a las restricciones de alineación en b en esa arquitectura. Es posible que la misma estructura solo requiera 16 bytes en una arquitectura que solo requiera una alineación de 4 bytes para double.

¿No me cree?

Compruébelo usted mismo:

En última instancia, debe consultar el ABI de su plataforma de destino para comprender cómo un struct se empaqueta para ese destino.

O simplemente use sizeof si a usted personalmente no le importa, pero su código debe tener cuidado.

Respuesta

¿Cómo calculo el valor de sizeof (struct) en C?

No es así. El compilador lo hace.

En primer lugar, sizeof(struct) es un error de sintaxis. Probablemente se esté preguntando cómo determinar el tamaño de un tipo de estructura o de un objeto de ese tipo. Es importante ser preciso. (Entiendo que la eliminación de los detalles de las preguntas por parte de Quora lo dificulta).

Digamos que tiene un tipo de estructura llamado struct foo y / o un objeto de ese tipo llamado obj. El tamaño del tipo es sizeof (struct foo) y el tamaño del objeto (que es el mismo que el tamaño de su tipo) es sizeof foo . (Los paréntesis son obligatorios en el primer caso y no en el segundo. En realidad, hay dos formas diferentes del operador sizeof. Una se aplica a un nombre de tipo entre paréntesis y la otra a un expresión, que a menudo, pero no siempre, es un nombre de objeto.)

Puede estar pensando que puede calcular el tamaño de una estructura sumando los tamaños de sus miembros. No puedes. Los compiladores pueden insertar relleno entre miembros, y posiblemente después del último miembro, para satisfacer los requisitos de alineación. El tamaño de una estructura es al menos la suma de los tamaños de sus miembros, pero si necesita el tamaño de toda la estructura, simplemente use sizeof. Para eso es.

Deja una respuesta

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