Ciao!
Ho vari std::vector di puntatori smart.
Eseguo operazioni di spostamento dall'uno all'altro, creazioni a partire dal tipo di oggetto puntato, creazioni a partire dal contenuto di un altro puntatore e cancellazione arbitraria degli elementi. Ecco un riassunto dei tipi di operazione che eseguo.
class Lista
{
static std::vector<std::unique_ptr<Oggetto>> ListaOggetti;
static std::vector<std::unique_ptr<Oggetto>> AltraListaOggetti;
public:
static void AddOgg(int a) { ListaOggetti.push_back(std::make_unique<Oggetto>(a)); } //creazione pnt da oggetto
static int CntOgg() { return ListaOggetti.size(); }
static int CanOgg(int ind){ ListaOggetti.erase(ListaOggetti.begin() + ind); } //cancellazione
static void CpyOgg(int ind) { AltraListaOggetti.push_back(std::make_unique<Oggetto>(*ListaOggetti[ind].get())); } //creazione pnt da altro pnt
static void MveOgg(int ind) { //spostamento ptr
AltraListaOggetti.push_back(std::move(ListaOggetti[ind]));
ListaOggetti.erase(ListaOggetti.begin() + ind);
}
};
La profilatura va bene, l'unica operazione che richiede qualcosa di più è la chiamata a make_unique.
Mi è possibile definire una dimensione massima per questi vettori. Quindi mi domandavo se non fosse più efficiente convertire il std::vector in un std::array, in modo da avere delle raccolte già piene di puntatori che non puntano a nulla.
Secondo il mio ragionamento questo convertirebbe le operazioni di creazione make_unique in operazioni di assegnamento, le .erase() in .relase(), eliminerebbe il passaggio di .erase() dalle operazioni di spostamento ed eliminerebbe le push_back.
Inoltre, essendo questi contenitori quasi sempre pieni, mi sembra anche più azzeccato avere dei puntatori già disponibili e fissi che doverne creare e cancellare di continuo.
Insomma se il mio ragionamento fosse il giusto il guadagno sarebbe netto, ma dal momento che il programma è diventato grandicello prima di convertire tutto vorrei un parere!
Grazie!