Anche se sizeof(ref_var)
restituisce la dimensione dell'oggetto di riferimento, lo spazio è ancora necessario per memorizzare un riferimento in una struttura, ad esempio, e nelle implementazioni comuni lo spazio allocato per memorizzare un riferimento è uguale allo spazio assegnato per memorizzare un puntatore. Questo potrebbe non essere necessaria dalla norma, ma questo codice, almeno mostra l'effetto:
#include <iostream>
using namespace std;
char c1 = 'a';
char &c2 = c1;
struct x
{
char c1;
char c2;
char c3;
char c4;
int i4a;
char &r1;
int i4b;
int i4c;
x() : r1(c1) { }
};
struct y
{
char c1;
char c2;
char c3;
char c4;
int i4a;
int i4b;
int i4c;
};
int main()
{
cout << sizeof(c2) << endl;
cout << sizeof(y) << endl;
cout << sizeof(x) << endl;
return 0;
}
io non pretendo che si tratta di 'grande codice' - non è - ma dimostra un punto. Compilato sulla modalità (64 bit) MacOS X 10.6.4 con C++ compilatore GNU Compiler Collection (GCC 4.5.1) in default, l'output è:
1
16
24
Quando viene compilato in modalità a 32 bit, l'uscita è:
1
16
20
la prima linea di output dimostra che 'sizeof(ref_var)
' effettivamente restituire la dimensione dell'oggetto riferimento. La seconda riga mostra che una struttura senza riferimenti in essa ha una dimensione di 16 byte.La terza riga mostra che una struttura molto simile con un riferimento incorporato in esso a un limite di 8 byte (su un sistema in cui sizeof(int) == 4
) è 8 byte più grande della struttura più semplice in una compilazione a 64 bit e 4 byte più grande in un 32- compilazione bit. Per inferenza, la parte di riferimento della struttura occupa più di 4 byte e non più di 8 byte nella compilazione a 64 bit e occupa non più di 4 byte nella compilazione a 32 bit. Ciò suggerisce che (in almeno una popolare implementazione di C++) che un riferimento in una struttura occupa la stessa quantità di spazio di un puntatore - come affermato in alcune delle altre risposte.
Quindi, può dipendere dall'implementazione, ma il commento che un riferimento occupa lo stesso spazio di un puntatore è valido in almeno un'implementazione (piuttosto ampiamente utilizzata).
fonte
2010-09-19 07:31:38
La tua domanda '" I riferimenti richiedono spazio di archiviazione "'? Per favore, sii più preciso –
Sì, non sono abbastanza sicuro di cosa stia esattamente chiedendo. Potresti chiarire? –
@Prasoon: Giusto, e ancora più importante di come tutto si adatta all'ambiente a 64 bit? Se char e prende 8 byte e il char richiede 4, potrei anche fare tutto in base al valore se la memoria è un premio nella mia situazione. – Fanatic23