私のコードの一部は、ポインタを扱うとそれがポインタで動作するように持っているので、入力としてuintptr_t
を取ります。
私は今では整数で同じことをしなければならないので、私はそのコードを再利用したいと思います。
size_t
はuintptr_t
と同じですか?実装を変更し、uintptr_t
をsize_t
に置き換えるだけで、ポインタと整数の両方に同じコードを使用できますか?
私のコードの一部は、ポインタを扱うとそれがポインタで動作するように持っているので、入力としてuintptr_t
を取ります。
私は今では整数で同じことをしなければならないので、私はそのコードを再利用したいと思います。
size_t
はuintptr_t
と同じですか?実装を変更し、uintptr_t
をsize_t
に置き換えるだけで、ポインタと整数の両方に同じコードを使用できますか?
size_t
は、可能なオブジェクトの最大サイズの を収容するのに十分な大きさでなければなりません。 uintptr_t
は、 任意のポインターを含めるのに十分な大きさでなければなりません。これを考えると、 sizeof(uintptr_t) >= sizeof(size_t)
のバイト数( のすべてのバイトがアドレス可能でなければならないため)が保証されますが、それ以上は保証されません。 リニアアドレス指定のマシンでは、おそらく と同じサイズになります。一方、セグメント化されたアーキテクチャでは、 オブジェクトは1つのセグメントに存在する必要があるため、 は通常、uintptr_t
がsize_t
より大きくなる必要がありますが、ポインタはすべてがすべてのメモリをアドレスできる必要があります。
実装によって異なります(プロセッサ、ABI、コンパイラ、標準ライブラリも含まれます)。 size_t
はuintptr_t
と同じであるという保証はありません。しかし、それが起こる可能性があります(32ビットのLinux x86またはARMでは、両方とも32ビットの符号なし整数です)。
size_t
の目的は、(特に割り当てられたメモリチャンクの)サイズであるのに対して、uintptr_t
の目的は、ポインタと同じビットサイズの符号なし整数であることになります。
コンパイラごとに異なる結果があります。同じ結果を得たい場合は、32ビットLinux x86またはARM上にコンパイラをインストールする必要があります。