Mon premier problème est que j'ai, sur un projet, plusieurs objets qui ont une durée de vie (c'est à dire, une fois que j'ai de libre-l'un d'eux, je vais les libérer tous), puis j'ai voulu allouer un bloc de mémoire. J'ai des tableaux de trois différents types d'objets, struct foo
, void *
, et char
. Au début, je voulais malloc()
d'un bloc comme ceci:
// +---------------+---------+-----------+---------+---------+
// | struct foo[n] | padding | void *[m] | padding | char[o] |
// +---------------+---------+-----------+---------+---------+
Mais alors... comment ai-je pu accomplir cela sans faire appel à un comportement indéfini? I. e., le respect de type aliasing règles, aligment... Comment calculer correctement la taille du bloc de mémoire, de déclarer le bloc de mémoire (avec son effectif type), et comment obtenir des pointeurs vers tous les trois sections de façon portable?
(Je ne comprends que je ne pouvais malloc()
3 blocs, ce qui aurait pour résultat de trois free()
, mais j'aimerais savoir comment le faire avec un seul bloc, tandis que toujours bien comportés.)
Je voudrais étendre mon problème à une question plus générale: quelles précautions doit-on prendre pour mettre en œuvre un pool de mémoire pour les objets de dimensions arbitraires et l'alignement tout en gardant le programme comporte bien? (En supposant qu'il est possible de la mettre en œuvre sans avoir recours à un comportement indéfini.)