64ビットシステムでは、sizeof(unsigned long)
はシステムによって実装されるデータモデルに依存します。たとえば、LLP64(Windows)では4バイト、LP64(Linuxなど)では8バイトです。 sizeof(size_t)
とは何ですか? sizeof(long)
のようなデータモデルによって異なりますか?もしそうなら、どのように?
参照:
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ビットサイズを使用しても意味がありません。
オブジェクトのサイズを表すため、アーキテクチャによって異なります。したがって、32ビットシステムではsize_t
は、少なくとも32ビット幅になる可能性があります。 64ビットシステムでは、少なくとも64ビット幅になる可能性があります。
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で、残りは実装に依存するということです。
size_tは、64ビットマシンでは通常64ビットです