Eu tenho um contêiner de objetos abstratos que desejo renderizar. Normalmente, eu estaria armazenando std::unique_ptr<T>
ou std::shared_ptr<T>
dentro do meu contêiner, mas não quero alocar todos os elementos, já que essas classes new
formam um objeto.
Por exemplo, o polimorfismo é possível sem alocação de heap se todos os elementos não forem proprietários:
plf::hive<Base*> objects;
Derived t;
objects.insert(&t);
Gostaria que meu contêiner possuísse alguns de seus objetos. Minha solução atual é apenas armazenar std::variant<T*, std::unique_ptr<T>>
, portanto, todos os objetos proprietários são destruídos adequadamente e a vida útil dos objetos não proprietários não é gerenciada. Mas ainda estou alocando objetos cujo tempo de vida precisa ser gerenciado. O polimorfismo puramente baseado em pilha é possível?
EDIT: Estou bem em alocar espaço de heap para meus objetos serem armazenados. Só não quero que os próprios objetos sejam criados na pilha.
Sua pergunta gira em torno de alcançar o polimorfismo sem alocar os próprios objetos no heap, e você está explorando alternativas que permitem que alguns objetos sejam propriedade do contêiner, enquanto outros não. Parece que você está procurando uma maneira de ter comportamento polimórfico com objetos que residem na pilha ou em um pool de memória pré-alocado.
Uma abordagem para esse problema é usar uma técnica chamada "apagamento de tipo", que permite comportamento polimórfico sem necessariamente usar alocação de heap para cada objeto. No entanto, isso muitas vezes ainda envolve alguma alocação de heap para o próprio mecanismo de eliminação de tipo.
Uma alternativa é usar um buffer contíguo (como um std::array ou um array bruto) como um pool de memória onde você pode colocar seus objetos usando o posicionamento novo. Essa abordagem requer um gerenciamento cuidadoso da vida útil e do alinhamento dos objetos, mas pode evitar a alocação de heap por objeto.
Aqui está um exemplo conceitual -