2010-10-14 7 views
6

Kodun altında, 32-bit pencerelerde, görsel stüdyonda çalışıyor.Sınıf içerisindeki referans değişkeni neden her zaman 4 byte alıyor? (32-bit sistemde)

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

Çıktı: referans tipine sınıf irrespect içinde referans değişken için 4 bayt veren

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

Derleyici. Değişken değer bu 4 baytta saklanamaz.

Bu 4 baytta hangi bilgi derleyicisi depolanacak?

dahili olarak referans adresini saklıyor mu? Böylece referans ve referanslar birbirleriyle senkronize olmak için aynı yere yazabilirler.

Yoksa sembol tablosunda referans ismini mi saklıyor?

cevap

7

Bayt için olanlar referanstır. Bir referans dahili olarak yalnızca bir işaretçidir ve işaretçiler, veri türünden bağımsız olarak 32 bit sistemde 4 bayt kullanırlar, çünkü bu yalnızca bir adres, değerin kendisi değildir.

+0

Doğru. OP farkı görmek için 64-bit'e geçmeyi deneyebilir. –

0

Neden sınıf içindeki referans değişkeni her zaman tipine bakılmaksızın 4 bayt alıyor?

It isn't!

C++ 03 5.3.3

referans veya bir referans tipine uygulandığında, sonuç atıfta bulunulan tipteki arasında boyutudur.

Ayrıca 8.3.2

Bir referans depolama gerektiren olsun veya olmasın belirtilmemiş olduğunu söylüyor.

+0

@Saurav: Nesnenin boyutunu kontrol ediyorum. tek başına referans değişken, başvuru boyutuyla aynıdır. – bjskishore123

+1

@ bjskishore123: Referanslar işaretçi olarak uygulanmış olsa da, "sınıf içindeki referans değişkenin her zaman 4 baytlık türden bağımsız olduğunu" kabul ettiğine dair varsayımınız yanlıştır. 'Test ' durumunda '' '' '' '' '' dinlileri derleyici [padding bytes] (http://en.wikipedia.org/wiki/Data_structure_alignment) durumundadır. –

+0

@Saurav: Çift kullanıyorum bile, 4 byte'lık bir nesne boyutu olarak gösteriliyor. Bu karışıklık. Pls söz konusu çıktıyı kontrol et. – bjskishore123