2009-06-05 15 views
5

Esiste una raccolta, che è a conoscenza di shared_ptr internals, ed evita la copia regolare degli elementi shared_ptr memorizzati in favore della copia del loro puntatore debole interno?Raccolta specializzata per shared_ptr

Ciò significa implicitamente che nessuna chiamata del costruttore/distruttore verrà eseguita e che non verrà effettuata alcuna manipolazione dei contatori di riferimento di shared_ptrs.

risposta

3

che è a conoscenza di interni shared_ptr,

che dovrebbe rispondere alla tua domanda proprio lì. Per essere a conoscenza degli interni, una raccolta di questo tipo dovrebbe quasi sicuramente far parte delle librerie di puntatori intelligenti di boost. Sfortunatamente, non esiste una cosa del genere.

Questo è davvero uno svantaggio di puntatori intelligenti. Consiglierei l'uso di strutture dati che limitano il numero di copie eseguite internamente. Le riallocazioni di Vector saranno dolorose. Forse un deque, che ha un'assegnazione basata su chunked, sarebbe utile. Tenete presente anche che le implementazioni dei vettori tendono ad acquisire nuova memoria in blocchi esponenzialmente crescenti. Quindi non riassegnano, diciamo, ogni 10 elementi. Invece si potrebbe iniziare con 128 elementi, quindi il vettore si riserva 256, quindi si sposta fino a 512, 1024, ecc. Ogni volta raddoppiando ciò che è necessario.

In breve, c'è boost ptr_vector o preallocazione delle strutture dati con spazio sufficiente per impedire la copia interna.

9

In teoria, dopo l'adozione del C++ 0x, i contenitori verranno modificati per utilizzare semantica di spostamento laddove appropriato. A quel punto, shared_ptr può anche essere modificato per avere un costruttore di mosse per minimizzare la regolazione del conteggio dei riferimenti non necessaria.

+2

Nella bozza C++ 0x, shared_ptr ha già questo comportamento. –

+0

Bene allora eccoti! :) – MSN