offsetof ist definiert in der stddef
, die in C über stddef.h
, bzw. in C++ über cstddef
eingebunden wird.
offsetof() ist ein Präprozessor-Makro, das das Byte-Offset von Membern innerhalb einer Struktur ausgibt. Der Rückgabewert gibt also an, wieviele Bytes sich ein Member hinter dem Beginn der Struktur befindet.
#define offsetof( type, member )
type: Strukturdatentyp
member: Name eines Members des Strukturdatentyps (Datentyp size_t)
Return value: Byteoffset des Members innerhalb der Struktur
#include <stdio.h> // für printf() #include <stdlib.h> // für EXIT_SUCCESS #include <stddef.h> struct Person { char Vorname[32]; char Nachname[32]; char Geschlecht; unsigned int Alter; }; int main( void ) { printf( "Groesse der Datenstruktur: %d\n", sizeof( struct Person )); printf( "Position Vorname : %d\n", offsetof(struct Person,Vorname)); printf( "Position Nachname : %d\n", offsetof(struct Person,Nachname)); printf( "Position Geschlecht : %d\n", offsetof(struct Person,Geschlecht)); printf( "Position Alter : %d\n", offsetof(struct Person,Alter)); return EXIT_SUCCESS; }
Ausgabe:
Groesse der Datenstruktur: 72 Position Vorname : 0 Position Nachname : 32 Position Geschlecht : 64 Position Alter : 68
In C++ wird mit einer Struktur oder Klasse automatisch ein Datentyp angelegt (typedef). In C geschieht das nicht. Der Name des Typs lautet deswegen struct Person
und nicht nur Person
.
Die Größe des Datentyps ist 69 Bytes. Der hier verwendete GNU-Compiler optimiert hier die Struktur auf Zugriffsgeschwindigkeit und fügt deswegen drei unbenutzte Bytes ein. Wird die Struktur in ein Array eingesetzt, so lässt sich so schneller auf die einzelnen Elemente zugreifen.