Моя первоначальная проблема заключается в том, что у меня есть в проекте несколько объектов, которые имеют пожизненное (то есть, когда я освобожу их, я освобожу их всех), тогда я хотел выделить один блок памяти. У меня есть массивы трех разных типов объектов, struct foo
, void *
и char
. Сначала я хотел malloc()
создать такой блок:
// +---------------+---------+-----------+---------+---------+
// | struct foo[n] | padding | void *[m] | padding | char[o] |
// +---------------+---------+-----------+---------+---------+
Но тогда... как я мог выполнить это без вызова поведения undefined? I.e., соблюдая правила псевдонимов типов, aligment... Как правильно рассчитать размер блока памяти, объявить блок памяти (с его эффективным типом) и как правильно получить указатели на все три раздела внутри него портативно?
(я понимаю, что мог бы malloc()
3 блока, что приведет к трем free()
, но я хотел бы знать, как это сделать с одним блоком, хотя все еще хорошо себя вести.)
Я хотел бы распространить свою проблему на более общий вопрос: какие меры предосторожности следует предпринять для реализации пула памяти для объектов с произвольными размерами и выравниванием при сохранении программа хорошо себя ведет? (Предполагая, что его можно реализовать без вызова поведения undefined.)