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?
Regular malloc aligns memory suitable for any object type (which, in practice, means that it is aligned to alignof(max_align_t)). This function is useful for over-aligned allocations, such as to SSE, cache line, or VM page boundary.
Since many CPUs as well as many operation system do have alignment requirements, most malloc implementation will always return aligned memory but which alignment rules it follows is system specific.
The GNU documentation states that malloc is aligned to 16 byte multiples on 64 bit systems.
Description. malloc. allocates the specified number of bytes. realloc. increases or decreases the size of the specified block of memory, moving it if necessary.
Alignment requirements are recursive: The alignment of any struct
is 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 of double
, and it will be padded to be a multiple of the size of double (e.g. 4 (int), 1 (char), 3 (padding), 8 (double)). The struct Y { int; X; float; }
has the alignment of X
, which is the largest and equal to the alignment of double
, and Y
is 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_t
whose alignment is that largest alignment.
All malloc()
needs to do is to pick an address that's a multiple of that value.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With