2015-11-07 18 views
8

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

+2

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? –

+1

@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

+0

la risposta è qui: http://stackoverflow.com/a/13460653/2183287 –

risposta

7

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 è .

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).