offsetof y disposición en C
offsetof reporta dónde queda un miembro; así funcionan los contenedores intrusivos.
#include <stddef.h>
#include <stdio.h>
typedef struct {
int id;
char label[8];
double score;
} Record;
#define CONTAINER_OF(ptr, type, member) \
((type *) ((char *) (ptr) - offsetof(type, member)))
void layout(void) {
Record r = {7, "step", 91.5};
double *score = &r.score;
Record *back = CONTAINER_OF(score, Record, score);
printf("%zu %zu %zu\n", offsetof(Record, id),
offsetof(Record, label), offsetof(Record, score));
printf("recovered id %d\n", back->id);
}
Cómo funciona
- Produce un desplazamiento en bytes como
size_tdesde el inicio del struct. - Restarlo de la dirección de un miembro recupera el struct.
- Ese es el truco detrás de la macro container_of.
Palabras clave y builtins usados aquí
chardoubleintstructtypedefvoid
El intento, en números
- Líneas
- 21
- Caracteres a escribir
- 466
- Tokens
- 111
- Ritmo de tres estrellas
- 100 tpm
Al ritmo de tres estrellas de 100 tokens por minuto, este intento toma unos 67 segundos.
Paso 4 de 5 en Uniones y disposición; paso 4 de 13 en Uniones, campos de bits y comportamiento indefinido.