2010-09-19 9 views
5

Si è imbattuto in questo mentre si cercava la risposta a un'altra domanda su SO (References Vs Variable Gets). La mia domanda è che per tutti gli ambienti a 64 bit è garantito che un riferimento a una variabile sarà di 64 bit anche se l'originale avesse una dimensione minore? Come nei riferimenti char in ambiente a 64 bit sarebbe> sizeof (char)? C'è qualche sezione nello standard che lo specifica esplicitamente?Dimensioni dei riferimenti in ambienti a 64 bit

MODIFICA: per maggiore chiarezza - char c1 = 'a'; char & c2 = c1; La mia domanda è sizeof (c2)> sizeof (c1) in macchine a 64 bit?

+0

La tua domanda '" I riferimenti richiedono spazio di archiviazione "'? Per favore, sii più preciso –

+0

Sì, non sono abbastanza sicuro di cosa stia esattamente chiedendo. Potresti chiarire? –

+0

@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

risposta

13

Lo standard (ISO C++ - 03) dice che la cosa seguente sui riferimenti

It is unspecified whether or not a reference requires storage (3.7).

per favore qualcuno mi corregga se sbaglio o se non ho capito bene la sua domanda.

EDIT:

La mia domanda è sizeof (c2)> sizeof (c1) in macchine a 64 bit?

No, come @Chubsdad notato sizeof(c2) = sizeof (c1), la citazione pertinente dal standard è

When applied to a reference or a reference type, the result is the size of the referenced type. (ISO C++ $ 5.3.3/2)

+2

Questo risponde all'ultima parte della domanda. La gente dimentica che ci sono molte strane architetture di CPU là fuori, anche oggi nell'età presumibilmente moderna. – slebetman

+3

No. sizeof (c2) è sempre sizeof (c1) poiché entrambi c1 e c2 sono di tipo "char" che per definizione è 1. – Chubsdad

+2

@Chubsdad: 'sizeof (c1)' è sempre 1, 'c2' è un alias di 'c1'. Quindi sizeof ('c2') dovrebbe essere uguale a 1. Ma stai trascurando il fatto che internamente un riferimento può essere implementato usando un puntatore. IMHO questo è definito come "implementazione" per essere pedante. –

8

$ 8.3.2/3 - It is unspecified whether or not a reference requires storage.

sizeof applicata a riferimenti è fondamentalmente la dimensione del referrand.

Quindi se 'r' è un riferimento intero a 'i', non è specificato se esiste una memoria effettiva per 'r'. Tuttavia, sizeof(r) sta per sizeof(i).

Se "r" è un riferimento a un "carattere", sizeof(r) sarà sempre sizeof(char) == 1 per definizione.

+2

... meno che non avete un sistema a 8 bit con memoria massima 256 byte; P –

+1

@Delan Azabani: sizeof (char) per definizione è sempre 1 anche se prende 32 bit su un'architettura. – Chubsdad

+1

@Delan: Chubsdad ha ragione. È la costante 'CHAR_BITS' che cambia con il numero di bit. 'sizeof (char)' è definito per essere sempre '1'. – sbi

4

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

+0

+1 per l'esperimento .... :) –

Problemi correlati