В общем история имеет продолжение, в llvm существует класс реализующий такой паттерн:
https://llvm.org/doxygen/TrailingObjects_8h.html
Сама идея тривиальна, давайте вместо аллокации под структуру с указателями и отдельными аллокациями на каждый массив сделаем одну большую аллокацию под все массивы + структуру.
Получим 1 аллокацию вместо н + 1, плюс уменьшаем уровень косвенности для доступа к массивам. В llvm написали обертку за которой скрыли вычисления размера аллокации и соответственно адреса по которым валидно обращаться, с учётом выравнивания.
В си для одного массива такое сделать попроще, называется flexible array member.
Лично я к сожалению костылил для одного конкретного кейса такое и не делал общего паттерна, круто если кто-то знает/сделает хорошую опенсурс мит реализацию, мне кажется довольно популярный и красивый кейс.
Post #628
723
Loser story Вы никогда не задумывались над такой штукой: часто бывает в плюсах, что некоторые объекты создаются только как указатель в куче, и иногда такие объекты содержат массив фиксированного, но к сожалению известного только в рантайме размера, в таком кейсе вообще…