Raccolta di unique_ptr, vector o array?

di il
1 risposte

Raccolta di unique_ptr, vector o array?

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!

1 Risposte

  • Re: Raccolta di unique_ptr, vector o array?

    Gli std::array sono poco più di un wrapper degli array C.
    Se già puoi prefissare la lunghezza massima del container l'unico vantaggio che avresti rispetto al vector è il risparmio della allocazione / reallocazione di memoria interna a vector, che comunque puoi evitare fornendo al costruttore di vector il numero massimo di elementi che deve contenere:
    
    static std::vector<std::unique_ptr<Oggetto>> ListaOggetti(20); // in pseudo codice.
    

    avendo come risultato tutti gli unique_ptr a nullptr.
    In ogni caso una chiamata a make_unique<Oggetto> la devi fare per creare l'oggetto.
Devi accedere o registrarti per scrivere nel forum
1 risposte