2015-12-26 15 views
6

Soru oldukça basit. 32bit sistemlerdeHer iki 32bit ve 64 bit sistemlerde imzasız uzun süre 32 bit sistemlerde std :: size_t 4 bayt 8 bayttır?

: 64bit sistemlerde

std::cout << sizeof(unsigned int);  //4 
std::cout << sizeof(unsigned long long); //8 
std::cout << sizeof(std::size_t);   //4 

:

std::cout << sizeof(unsigned int);  //4 
std::cout << sizeof(unsigned long long); //8 
std::cout << sizeof(std::size_t);   //8 

Sadece MSVC sahiptir uygulanmasını kontrol ve şuna benzer: Peki neden

#ifdef _WIN64 
    typedef unsigned __int64 size_t; 
#else 
    typedef unsigned int  size_t; 
#endif 

Hem 32bit hem de 64bit sy üzerinde std::size_tunsigned long long (std::uintmax_t) yapmayın açıkça desteklediklerinde kaynaklanıyor? Yoksa yanlış mıyım?

+3

size_t, olası en büyük nesnenin boyutunu tutacak kadar büyük olan en verimli türde olmalıdır. 32 bit sistemde, bu 32 bit işaretsiz bir tamsayıdır. 64 bit, 32 bit sistemde daha az verimlidir. (X86-64'te bile 64 bit, 32-bit'ten daha az verimli bir miktardır, ancak 32-bit, maksimum boyuttaki nesnelerin boyutu için yeterince büyük değildir). 32 bit modda, 64 bit işlemcide bile, 64 bit işaretsiz 32 bitten çok daha az verimlidir. – JSF

cevap

8

size_t'un noktası, mümkün olan en büyük nesnenin boyutunu tutabilecektir. 32 bitlik bir sistemde hiçbir nesne 2'den fazla 32 bayta sahip olamaz, bu nedenle 32 bitlik bir tür yeterlidir.

64 bit türünü kullanmak için boşa harcanabilir ve çalışma zamanında potansiyel olarak daha pahalı olur.

6

Bu anlamsız bir israf olurdu. 32 bitlik bir makinede 4 GB'lık bir adres alanınız vardır, bu nedenle 4 GB'den büyük nesneler olamaz, böylece 32 bit size_t aralığı mükemmeldir.

İlgili konular