2010-10-14 9 views
6

Mam poniżej kod, działający w 32-bitowych oknach, visual-studio.Dlaczego zmienna referencyjna w klasie zawsze pobiera 4 bajty niezależnie od typu? (w systemie 32-bitowym)

template <class T> 
class Test 
{ 
public: 
T &ref; 
Test(T &x) 
    :ref(x) 
{} 
}; 

int main() 
{ 
cout<<"sizeof Test<int> : "<<sizeof(Test<int>)<<endl; 
cout<<"sizeof Test<double> : "<<sizeof(Test<double>)<<endl; 
cout<<"sizeof Test<char> : "<<sizeof(Test<char>)<<endl; 
} 

wyjściowa wynosi:

sizeof Test<int> : 4 
sizeof Test<double> : 4 
sizeof Test<char> : 4 

Kompilator daje 4 bajty dla odniesienia zmiennej wewnątrz klasy irrespect typu odniesienia. Wartości zmiennej nie można zapisać w tych 4 bajtach.

Jaki kompilator informacji będzie przechowywany w tych 4 bajtach?

czy wewnętrznie przechowuje adres referencyjny? aby referencje i odniesienia mogły pisać w tej samej lokalizacji, aby były ze sobą zsynchronizowane.

Czy przechowuje nazwę odniesienia w tabeli symboli?

Odpowiedz

7

Te dla bajtów są odniesieniami. Odwołanie jest po prostu wewnętrznie wskaźnikiem, a wskaźniki zazwyczaj używają 4 bajty w systemie 32-bitowym, niezależnie od typów danych, ponieważ jest to tylko adres, a nie sama wartość.

+0

Zgadza się. OP może spróbować zmienić na 64-bitowy, aby zobaczyć różnicę. –

0

Dlaczego zmienna referencyjna w klasie zawsze pobiera 4 bajty, niezależnie od typu?

It isn't!

C++ 03 5.3.3

zastosowany do odniesienia lub typu urządzenia, to wynikiem jest wielkość wymienionej typu.

także 8.3.2 mówi

Jest nieokreślony czy odwołanie wymaga magazynowania.

+0

@Saurav: Sprawdzam rozmiar obiektu. sama zmienna referencyjna sizeof jest taka sama, jak wielkość referencyjna. – bjskishore123

+1

@ bjskishore123: Twoje założenie, że "zmienna referencyjna w klasie zawsze pobiera 4 bajty bez względu na typ" jest niepoprawne, chociaż referencje są zaimplementowane jako wskaźniki. Reszta '3' bajtów w przypadku' Test 'są wstawione kompilator [dopełnienie bajtów] (http://en.wikipedia.org/wiki/Data_structure_alignment). –

+0

@Saurav: Nawet jeśli używam podwójnie, pokazuje on 4 bajty tylko jako rozmiar obiektu. To zamieszanie. Pls sprawdzi moje dane wyjściowe. – bjskishore123

Powiązane problemy