質問は簡単です。 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_t
unsigned long long
(std::uintmax_t
)彼らが明確にそれをサポートしているときに生じる?それとも間違ってるの?
size_tは、最大の可能なオブジェクトのサイズを保持するのに十分な大きさの最も効率的な型である必要があります。 32ビットシステムでは、それは32ビットの符号なし整数です。 64ビットは32ビットシステムでは効率が悪い。 (x86-64上でさえ、64ビットは32ビットよりも効率的ではありませんが、32ビットは最大サイズのオブジェクトのサイズにとって十分ではありません)。 32ビットモードでは、64ビットCPUであっても、64ビットの符号なしは32ビットよりはるかに効率が悪いです。 – JSF