2012-05-04 13 views
8

Su una macchina a 32 bit ottengo sempre il sizeof di un riferimento di 4 byte anche se si tratta di un riferimento a un doppio, quindi cosa memorizza realmente in questi 4 byte.perché la dimensione di riferimento è sempre 4 byte - C++

EDIT:

class A{ 
public: 
    double& a; 
}; 

int main(){ 
    cout << sizeof(A) << endl; // this will print out 4 
} 
+8

Non è possibile ottenere la dimensione di un riferimento, perché un riferimento non è un oggetto. Per favore mostraci con quale codice stai testando. –

+0

perchè i voti negativi? – AlexDan

+3

Perché la tua domanda non ha senso. Come dice @R.MartinhoFernandes, non è possibile ottenere le dimensioni di un riferimento. Quindi, a meno che non pubblichi un codice che mostri quello che stai facendo *, non abbiamo idea di cosa stai chiedendo, o come rispondere – jalf

risposta

30

Lo standard è abbastanza chiaro su sizeof (C++ 11, 5.3.3/4):

Quando viene applicato un riferimento o un tipo di riferimento , il risultato è la dimensione del tipo di riferimento.

Quindi, se davvero sta assumendo sizeof(double&), il compilatore è che ti dice che è sizeof(double) 4.

Aggiornamento: Allora, che cosa realmente state facendo sta applicando sizeof ad un tipo di classe. In tal caso,

Quando applicato ad una classe, il risultato è il numero di byte in un oggetto di quella classe [...]

Così sappiamo che la presenza di riferimento all'interno di A ne occorrono 4 byte. Questo perché anche se lo standard non impone come devono essere implementati i riferimenti, il compilatore deve ancora implementarli in qualche modo. Questo potrebbe in qualche modo essere molto diverso a seconda del contesto, ma per un membro di riferimento di un tipo di classe l'unico approccio che ha senso è nascosto in un double* dietro la schiena e chiamandolo un double& in faccia.

Quindi, se la propria architettura è a 32 bit (in cui i puntatori sono lunghi 4 byte) ciò spiegherebbe il risultato.

Basta ricordare che il concetto di un riferimento non è legato a nessuna implementazione specifica. Lo standard consente al compilatore di implementare i riferimenti come vuole.

19

Non è possibile, e non lo è.

Un riferimento C++ è non un puntatore. È un alias di un oggetto. A volte, il compilatore sceglie di implementare questo utilizzando un puntatore. Ma spesso lo implementa con senza fare nulla. Generando semplicemente il codice che si riferisce direttamente all'oggetto originale.

In ogni caso, sizeof applicato a un tipo di riferimento non fornisce la dimensione di un riferimento. Quindi non è molto chiaro cosa stai facendo, rendendo impossibile spiegare cosa sta succedendo.

Modifica

Ora che hai mostrato qualche codice, possiamo rispondere alla domanda:

sta assumendo le dimensioni di una classe che contiene un riferimento.Come ho detto sopra, un riferimento non è un puntatore, ma quando necessario, il compilatore può ricorrere all'utilizzo di un puntatore per rappresentarlo. Quando si crea una classe contenente un riferimento, l'unico modo (sensato) in cui il compilatore può implementarlo è la definizione di una classe che contiene l'indirizzo di un oggetto. Sui sistemi a 32 bit, gli indirizzi sono 32 bit o 4 byte, larghi. Dunque sizeof tale classe sarà (tipicamente) 4.

+0

Sbagliato su così tanti livelli. "A volte, il compilatore sceglie di implementarlo usando un puntatore, ma spesso lo implementa non facendo nulla". Questo non è in alcun modo diverso da un numero intero o da qualsiasi altra cosa. A meno che tu non accetti che 'int i = 1;' non dichiara nulla (almeno se non cambi 'i' in seguito'), non puoi dire che un riferimento non è niente. – jpalecek

+14

Certo che posso. Se fai qualcosa del genere: 'int i = 0; int & r = i', quindi i compilatori tipicamente * not * generano codice per mettere un puntatore a 'i' in pila. Invece, le operazioni successive su 'r' (per esempio,' r ++ ') emetteranno lo stesso * esatto * stesso codice come se avessi scritto' i ++ 'Un riferimento è solo un alias. – jalf

+0

Un riferimento è esattamente un puntatore. Qualsiasi ottimizzazione che un compilatore può fare con 'int i; int & r = i', può fare con 'int i; int * r = & i'. Qualsiasi ottimizzazione non può fare con un puntatore, non può fare con un riferimento. Il problema dell'aliasing del puntatore è presente anche nei riferimenti. –

Problemi correlati