following excerpted from here
pw = (widget *)malloc(sizeof(widget));allocates raw storage. Indeed, the malloc call allocates storage
that’s big enough and suitably aligned to hold an object of type
widget
also see fast pImpl from herb sutter, he said:
Alignment. Any memory Alignment. Any memory that’s allocated
dynamically via new or malloc is guaranteed to be properly aligned for
objects of any type, but buffers that are not allocated dynamically
have no such guarantee
I am curious about this, how does malloc know alignment of the custom type?
Alignment requirements are recursive: The alignment of any
structis simply the largest alignment of any of its members, and this is understood recursively.For example, and assuming that each fundamental type’s alignment equals its size (this is not always true in general), the
struct X { int; char; double; }has the alignment ofdouble, and it will be padded to be a multiple of the size of double (e.g. 4 (int), 1 (char), 3 (padding), 8 (double)). Thestruct Y { int; X; float; }has the alignment ofX, which is the largest and equal to the alignment ofdouble, andYis laid out accordingly: 4 (int), 4 (padding), 16 (X), 4 (float), 4 (padding).(All numbers are just examples and could differ on your machine.)
Therefore, by breaking it down to the fundamental types, we only need to know a handful of fundamental alignments, and among those there is a well-known largest. C++ even defines a type
max_align_twhose alignment is that largest alignment.All
malloc()needs to do is to pick an address that’s a multiple of that value.