c++ - memory alignment into structure - alignment size equal to largest member size -
c++ - memory alignment into structure - alignment size equal to largest member size -
i know why must take, alignment size of structure, alignment size equal largest fellow member size structure.
example :
struct mixeddata { char data1; short data2; int data3; char data4; };
if take largest fellow member (int data3)
, alignment 4 bytes, have do:
struct mixeddata /* after compilation in 32-bit x86 machine */ { char data1; /* 1 byte */ char padding1[1]; /* 1 byte next 'short' aligned on 2 byte boundary assuming address construction begins number */ short data2; /* 2 bytes */ int data3; /* 4 bytes - largest construction fellow member */ char data4; /* 1 byte */ char padding2[3]; /* 3 bytes create total size of construction 12 bytes */ };
but why don't have, after char data1
, char padding1[3]
short data2
begins @ adress(data1) + 4
instead of char data1[1]
?
and, same logic, why don't have short padding3[1]
after short data2
?
another question: if on 64 bits processor, should utilize 8 bytes alignement, have set next :
struct mixeddata /* after compilation in 64-bit x86_64 machine */ { char data1; /* 1 byte */ char padding1[7]; /* 7 bytes */ int data3; int padding2[1]/* 4 bytes */ char data4; char padding3[7]; /* 7 bytes create total size of construction 24 bytes */ };
?
so total size 24 bytes multiple of 8 bytes ?
the overall alignment of construction should of element greatest alignment requirement. required purpose of ensuring that, example, array of structures aligned. if didn't have that, size of struct { int x; char c; };
have first element aligned, next 3 have x
unaligned.
it possible convince compiler generate "packed" info construction (with no alignment padding) , utilize packed array, it's bad thought utilize in special cases, because @ best it's slower, @ worst causes execution stop due "unaligned access trap" in processor.
if size of int
4 bytes [it compilers i'm aware of - long
either 4 or 8 bytes, depends on compiler], both on 32- , 64-bit (at to the lowest degree x86) 4 byte aligned.
if want have 7 byte "gap" in struct, work:
struct x { char c; uint64_t x; };
which of course of study have:
struct x { char c; char padding[7]; uint64_t x; };
c++ c memory-alignment
Comments
Post a Comment