2015-12-26 9 views
6

質問は簡単です。 32ビットシステムでなぜ32ビットシステムでは、unsigned long longが32ビットシステムと64ビットシステムの両方で8バイトである場合、std :: size_tが4バイトであるのですか?

:64ビットシステムで

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 

私はMSVCが持つ実装をチェックし、それは次のようになります。では、なぜ

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

32ビットと64ビットの両方でstd::size_tunsigned long longstd::uintmax_t)彼らが明確にそれをサポートしているときに生じる?それとも間違ってるの?

+3

size_tは、最大の可能なオブジェクトのサイズを保持するのに十分な大きさの最も効率的な型である必要があります。 32ビットシステムでは、それは32ビットの符号なし整数です。 64ビットは32ビットシステムでは効率が悪い。 (x86-64上でさえ、64ビットは32ビットよりも効率的ではありませんが、32ビットは最大サイズのオブジェクトのサイズにとって十分ではありません)。 32ビットモードでは、64ビットCPUであっても、64ビットの符号なしは32ビットよりはるかに効率が悪いです。 – JSF

答えて

8

size_tのポイントは、可能な限り大きなオブジェクトのサイズを保持できることです。 32ビットシステムでは、オブジェクトは2 ** 32バイト以上を占めることができないため、32ビットタイプで十分です。

64ビットタイプを使用すると、スペースが無駄になり、実行時に潜在的に高価になる可能性があります。

6

それは無意味な無駄でしょう。 32ビットマシンでは4 GBのアドレス空間があるので、4 GBを超えるオブジェクトを持つことはできませんので、32ビットの範囲はsize_tで十分です。

関連する問題