Un'istanza unique_ptr
(senza un deleter personalizzato) ha lo stesso ingombro di memoria di un puntatore raw o un'istanza memorizza più del solo puntatore?Ingombro di memoria di unique_ptr
risposta
Come suggerito @JoachimPileborg, con GCC 4.8 (x64) questo codice
std::cout << "sizeof(unique_ptr) = " << sizeof(std::unique_ptr<int>) << '\n';
produce questo risultato:
sizeof (unique_ptr) = 8
Così, ai sensi della presente implementazione, la risposta è sì.
Questo non è sorprendente: dopo tutto, unique_ptr
non aggiunge caratteristiche a puntatori prime (ad esempio un contatore come shared_ptr
in effetti, se stampo sizeof(shared_ptr<int>)
il risultato questa volta è 16
.). unique_ptr
si prende cura di alcuni aspetti della gestione dei puntatori.
A proposito, essendo uno unique_ptr
diverso da uno grezzo, il codice generato sarà diverso quando si utilizza uno o l'altro. In particolare, se un unique_ptr
esce dal campo di applicazione nel codice, il compilatore genererà il codice per il distruttore di quella particolare specializzazione e utilizzerà il codice ogni volta che un unique_ptr
di quel tipo verrà distrutto (e questo è esattamente quello che vuoi).
Questa è una domanda molto specifica per l'implementazione e, in quanto tale, può essere molto diversa tra le diverse librerie standard. Ma per un semplice controllo, perché non usare 'sizeof' per controllare e confrontare con un puntatore raw? –
@JoachimPileborg Perché pensavo che altre persone potrebbero avere la stessa domanda in futuro. Buon punto Tecnicamente avrei dovuto chiedere: "È * possibile * implementare' unique_ptr' con lo stesso ingombro di memoria di un puntatore raw "come probabilmente farebbero le implementazioni se possibile. – Museful
la risposta è qui: http://stackoverflow.com/a/13460653/2183287 –