2010-09-19 10 views
5

Przenieśmy się przez to podczas przeglądania odpowiedzi na inne pytanie na SO (References Vs Variable Gets). Moje pytanie brzmi: czy dla wszystkich środowisk 64-bitowych zagwarantowano, że odniesienie do zmiennej będzie miało 64 bity, nawet jeśli oryginał miał mniejszy rozmiar? Jak w odwołaniach do znaków w środowisku 64-bitowym byłoby> sizeof (char)? Czy jest jakaś sekcja w standardzie, która wyraźnie to określa?Wielkość odniesień w środowiskach 64-bitowych

EDYCJA: Dla większej jasności - char c1 = 'a'; char & c2 = c1; Moje pytanie to sizeof (c2)> sizeof (c1) w maszynach 64-bitowych?

+0

Czy Twoje pytanie brzmi "Czy odniesienia wymagają przechowywania"? Proszę bardziej precyzyjnie. –

+0

Tak, nie jestem do końca pewien, o co dokładnie pytasz. Czy mógłbyś wyjaśnić? –

+0

@Prasoon: Racja, a co ważniejsze, jak to wszystko pasuje do środowiska 64-bitowego? Jeśli char ma 8 bajtów, a char ma 4, równie dobrze mogę zrobić wszystko, jeśli pamięć jest premią w mojej sytuacji. – Fanatic23

Odpowiedz

13

Standard (ISO C++ - 03) mówi po rzeczą odniesień

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

ktoś proszę mnie poprawić, jeśli się mylę czy nie mam rozumieć swoje pytanie poprawnie.

EDIT:

Moje pytanie jest sizeof (c2)> sizeof (c1) w maszynach 64-bitowych?

Nie, jak @Chubsdad zauważył sizeof(c2) = sizeof (c1), odpowiedni cytat z normy jest

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

To odpowiada na ostatnią część pytania. Ludzie zapominają, że istnieje wiele dziwnych architektur procesorów, nawet dzisiaj w podobno nowoczesnym wieku. – slebetman

+3

Nr sizeof (c2) jest zawsze sizeof (c1), ponieważ zarówno c1 jak i c2 są typu "char", który z definicji jest 1. – Chubsdad

+2

@Chubsdad: 'sizeof (c1)' jest zawsze 1, 'c2' jest aliasem z "c1". Więc sizeof ("c2") powinno być równe 1. Ale przeoczyłeś fakt, że wewnętrznie referencja może być zaimplementowana za pomocą wskaźnika. IMHO jest to "implementacja zdefiniowana" jako pedantyczna. –

8

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

sizeof stosowane do referencji jest w zasadzie wielkość referrand.

Więc jeśli "r" jest liczbą całkowitą, która odnosi się do "i", nie jest określone, jeśli istnieje rzeczywiste miejsce przechowywania dla "r". Jednak sizeof(r) wewnętrznie oznacza sizeof(i).

Jeśli "r" jest odniesieniem do "znaku", sizeof(r) będzie zawsze z definicji oznaczać sizeof(char) == 1.

+2

... chyba że jesteś w systemie 8-bitowym z maksymalną pamięcią 256 bajtów; P –

+1

@Delan Azabani: sizeof (char) z definicji jest zawsze 1, nawet jeśli zajmuje 32 bity na architekturze. – Chubsdad

+1

@Delan: Chubsdad ma rację. Stała 'CHAR_BITS' zmienia się wraz z liczbą bitów. 'sizeof (char)' jest zdefiniowane tak, aby zawsze było '1'. – sbi

4

Chociaż sizeof(ref_var) zwraca rozmiar przywoływanego obiektu, to w dalszym ciągu wymagane jest miejsce do przechowywania referencji w strukturze, a w powszechnych implementacjach przestrzeń przydzielona do przechowywania odniesienia jest taka sama jak przestrzeń przydzielona do przechowywania wskaźnik. Że nie mogą być wymagane przez normę, ale ten kod przynajmniej pokazuje efekt:

#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; 
} 

robię nie udaje, że jest to „wielki kod” - nie jest - ale to pokazuje punkt. Zestawione w trybie (64 bity) MacOS X 10.6.4 z C++ kompilator z kompilatora Collection GNU (GCC 4.5.1) wartościowe, wyjście jest:

1 
16 
24 

przypadku zestawiane w trybie 32-bitowym wyjście jest:

1 
16 
20 

pierwszy wiersz wyjścia pokazuje, że „sizeof(ref_var)” rzeczywiście powrócić rozmiar odwołanie obiektu. Druga linia pokazuje, że struktura bez odnośnika ma rozmiar 16 bajtów.Trzecia linia pokazuje, że bardzo podobna struktura z odniesieniem zawartym w niej na 8-bajtowej granicy (w systemie, gdzie sizeof(int) == 4) jest 8 bajtów większa niż prostsza struktura w 64-bitowej kompilacji i 4 bajty większa pod 32- bitowa kompilacja. W wyniku wnioskowania część referencyjna struktury zajmuje więcej niż 4 bajty i nie więcej niż 8 bajtów w kompilacji 64-bitowej i zajmuje nie więcej niż 4 bajty w kompilacji 32-bitowej. Sugeruje to, że (w co najmniej jednej popularnej implementacji C++), że referencja w strukturze zajmuje tyle samo miejsca co wskaźnik - jak twierdzono w niektórych innych odpowiedziach.

Może to być zależne od implementacji, ale komentarz, że odwołanie zajmuje tę samą przestrzeń co wskaźnik, jest prawdziwy w co najmniej jednej (raczej szeroko stosowanej) implementacji.

+0

+1 za eksperyment .... –

Powiązane problemy