2012-12-28 8 views
6

可能性の重複:
size_t vs. intptr_tuintptr_tとsize_tは同じですか?

私のコードの一部は、ポインタを扱うとそれがポインタで動作するように持っているので、入力としてuintptr_tを取ります。

私は今では整数で同じことをしなければならないので、私はそのコードを再利用したいと思います。

size_tuintptr_tと同じですか?実装を変更し、uintptr_tsize_tに置き換えるだけで、ポインタと整数の両方に同じコードを使用できますか?

答えて

15

size_tは、可能なオブジェクトの最大サイズの を収容するのに十分な大きさでなければなりません。 uintptr_tは、 任意のポインターを含めるのに十分な大きさでなければなりません。これを考えると、 sizeof(uintptr_t) >= sizeof(size_t)のバイト数( のすべてのバイトがアドレス可能でなければならないため)が保証されますが、それ以上は保証されません。 リニアアドレス指定のマシンでは、おそらく と同じサイズになります。一方、セグメント化されたアーキテクチャでは、 オブジェクトは1つのセグメントに存在する必要があるため、 は通常、uintptr_tsize_tより大きくなる必要がありますが、ポインタはすべてがすべてのメモリをアドレスできる必要があります。

2

実装によって異なります(プロセッサ、ABI、コンパイラ、標準ライブラリも含まれます)。 size_tuintptr_tと同じであるという保証はありません。しかし、それが起こる可能性があります(32ビットのLinux x86またはARMでは、両方とも32ビットの符号なし整数です)。

size_tの目的は、(特に割り当てられたメモリチャンクの)サイズであるのに対して、uintptr_tの目的は、ポインタと同じビットサイズの符号なし整数であることになります。

-1

コンパイラごとに異なる結果があります。同じ結果を得たい場合は、32ビットLinux x86またはARM上にコンパイラをインストールする必要があります。

関連する問題