?
fukurokuju schrieb:
Padding bezeichnet das (automatische) Auffüllen von Strukturen durch den Compiler auf "runde" Bytes, damit Lese/Schreibzugriffe optimiert werden!?
genau das ist es.
die lösung dazu ist etwas kompliziert. dazu brauchst du sizeof und offsetof. sizeof ist im prinzip klar. es gibt, angewandt auf eine struct deren größe in byte zurück. offsetof gibt angewandt auf eine struct und ein attribut dieser struct, die anzahl an byte zurück, die vor diesem attribut in der struct existieren:
struct X {
int x;
int y;
};
offsetof(X, y)
offsetof hat den wert von sizeof(int), da vor y das attribut x klarerweise die größe von int hat.
struct X {
int x;
char y[1];
};
bei diesem beispiel ist sizeof(X) wahrscheinlich nicht sizeof(int) + sizeof(char), sondern eher mehr. wieviel, weißt du nicht. wir wissen aber, dass offsetof(X, y) die anzahl an byte zurückgibt, die vor y stehen. wenn wir jetzt sizeof(X) - offsetof(X, y) verwenden, bekommen wir in summe die größe von y plus padding zurück. man könnte theoretisch auch sizeof(int) nehmen, da das ein einfaches beispiel ist.
struct X {
int x1;
int x2;
char y[1];
};
hier ist das schon nerviger, weil du sizeof(int) gleich zwei mal nehmen musst. offsetof(X, y) ist aber genau das: sizeof(int) + sizeof(int). solltest du eine struct einmal ändern, fließt das in offsetof sofort ein. bei structs mit vielen attributen (zb. unterschiedlichen datentyps) ist es sowieso nervig, alle sizeof zusammenzuzählen. deshalb offsetof. damit du offsetof verwenden kannst, musst du für c stddef.h und für c++ cstddef includen.
ok. das zu offsetof
jetzt zu deinem fall. du allokierst databuffer von der größe sizeof(JOB_DESCRIPTION) + dateilänge - 1 (das kommt von char[1]). das is aber zu viel, da in sizeof(JOB_DESCRIPTION) auch das padding enthalten ist. deshalb ziehst du jetzt nicht mehr 1 ab, sondern (sizeof(JOB_DESCRIPTION) - offsetof(JOB_DESCRIPTION, file)). dann rechnet man herum und kommt zum ausdruck: offsetof(JOB_DESCRIPTION, file) + dateilänge. das -1 fällt weg, da das ja schon mit offsetof berücksichtigt wurde.