8

重複の可能性:
size_tとintptr_t

私のコードのいくつかはポインターを扱い、ポインターを処理する必要がuintptr_tあるため、入力として受け取ります。

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

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

4

3 に答える 3

18

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

于 2012-12-28T10:35:36.893 に答える
2

それは実装に依存します(そしてそれはプロセッサ、ABI、コンパイラ、標準ライブラリを含みます)。;size_tと同じであるという保証はありません。uintptr_tただし、それが発生する可能性があります(32ビットのLinux x86またはARMでは、どちらも32ビットの符号なし整数です)。

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

于 2012-12-28T09:16:15.023 に答える
-1

コンパイラが異なれば、結果も異なります。それらを同じにしたい場合は、コンパイラが32ビットLinux x86またはARMに設定されていることを確認する必要があります。そうすれば、正しく動作します。

于 2012-12-28T09:47:49.907 に答える