выдержка из здесь
pw = (widget *)malloc(sizeof(widget));
выделяет необработанное хранилище. Действительно, вызов malloc выделяет хранилище достаточно большое и достаточно выровненное, чтобы вместить объект типа widget
также смотрите fast pImpl от Херба Саттера, он сказал:
Alignment. Любая память Выравнивание. Любая память, которая выделяется динамически через new или malloc, гарантированно будет правильно выровнена для объектов любого типа, но буферы, которые не выделяются динамически не имеют такой гарантии
Мне интересно, откуда malloc знает выравнивание пользовательского типа?