web-dev-qa-db-ja.com

32ビットとさまざまな64ビットデータモデルのsizeof(size_t)は何ですか?

64ビットシステムでは、sizeof(unsigned long)はシステムによって実装されるデータモデルに依存します。たとえば、LLP64(Windows)では4バイト、LP64(Linuxなど)では8バイトです。 sizeof(size_t)とは何ですか? sizeof(long)のようなデータモデルによって異なりますか?もしそうなら、どのように?


参照:

Wikipediaの64ビットデータモデル

42
anonymous

size_tは、C標準により、sizeof演算子の符号なし整数戻り型(C99 6.3.5.4.4)、およびmallocとfriendsの引数(C99 7.20.3.3など)として定義されています。実際の範囲は、最大(SIZE_MAX)が少なくとも65535(C99 7.18.3.2)になるように設定されます。

ただし、これではsizeof(size_t)を決定できません。実装は、size_tの好きな表現を自由に使用できます(したがって、サイズの上限はありません)。また、実装はバイトを16ビットとして自由に定義できます。この場合、size_tはunsigned charと同等です。

ただし、それを別にすれば、一般的に、データモデルに関係なく、32ビットプログラムでは32ビットのsize_t、64ビットプログラムでは64ビットになります。通常、データモデルは静的データにのみ影響します。たとえば、GCCの場合:

`-mcmodel=small'
     Generate code for the small code model: the program and its
     symbols must be linked in the lower 2 GB of the address space.
     Pointers are 64 bits.  Programs can be statically or dynamically
     linked.  This is the default code model.

`-mcmodel=kernel'
     Generate code for the kernel code model.  The kernel runs in the
     negative 2 GB of the address space.  This model has to be used for
     Linux kernel code.

`-mcmodel=medium'
     Generate code for the medium model: The program is linked in the
     lower 2 GB of the address space but symbols can be located
     anywhere in the address space.  Programs can be statically or
     dynamically linked, but building of shared libraries are not
     supported with the medium model.

`-mcmodel=large'
     Generate code for the large model: This model makes no assumptions
     about addresses and sizes of sections.

ポインターはすべての場合で64ビットであることに注意してください。結局のところ、64ビットポインターを使用しても64ビットサイズを使用しても意味がありません。

52
bdonlan

オブジェクトのサイズを表すため、アーキテクチャによって異なります。したがって、32ビットシステムではsize_tは、少なくとも32ビット幅になる可能性があります。 64ビットシステムでは、少なくとも64ビット幅になる可能性があります。

10
Evan Teran

EDIT:コメントをありがとう-セクション6.5.3.4で述べている C99標準 で調べました:

結果の値は実装定義であり、そのタイプ(unsigned integer type)はsize_tであり、<stddef.h>(およびその他のヘッダー)で定義されます

したがって、size_tのサイズは指定されず、符号なし整数型でなければなりません。ただし、興味深い仕様は、標準の7.18.3章に記載されています。

size_tの制限

SIZE_MAX 65535

つまり、size_tのサイズに関係なく、許可される値の範囲は0〜65535で、残りは実装に依存するということです。

4
beef2k

size_tは、64ビットマシンでは通常64ビットです

4
adwords