7

GCC 4.4.1、C99

を使用しsize_tsize_tおり、unsigned int. ただし、32 ビットまたは 64 ビットのどちらを実行しているかによって異なります。

size_tバッファのサイズを格納するために使用します。

したがって、アーキテクチャ間で使用する場合、これはあまり移植性がないと思います。

size_t32ビットまたは64ビットで使用する場合の質問です。最も深刻な問題を引き起こすのはどのような状況ですか?

4

7 に答える 7

8

size_t実装上の任意のオブジェクトのバイト数を保持できることが保証されています。そのため、の戻りタイプはsizeofですsize_t

そうです、それはポータブルです。

于 2009-11-08T16:59:12.090 に答える
7

他の人が言ったように、表現可能なオブジェクトの結果またはサイズをバイト単位size_tで格納するために正しく、完全に受け入れられます。sizeof()気をつけなければならないことは、次のとおりです。

  1. size_t符号なし整数型と同じサイズです。unsigned intunsigned long、 などの最大の符号なし整数型と必ずしも同じバイト数ではありません。
  2. sizeof(size_t)実装で定義されたバイト数であるため、それをmemcpy'ing または 以外の整数型に代入することuintmax_tは悪い考えです。と同じかそれより小さいと仮定するのが安全かどうかさえ確信が持てませんuintmax_t
  3. size_tバイナリ ファイルに値を書き込んで、別のプロセス、別のマシン、または別のコンパイラ オプションでコンパイルされたものによって値を読み戻すことは、size_t健康に害を及ぼす可能性があります。
  4. size_tネットワークを介して値を送信sizeof(size_t)し、反対側のバッファを使用してそれを受信しようとするのは、かなり安全ではありません。

これらはすべて、 を除く他の整数型の標準的な問題unsigned charです。そのsize_tため、他の整数型と同じように移植性があります。

于 2009-11-08T17:16:00.133 に答える
1

malloc()またはread()を使用している場合は、バッファーにsize_tまたはssize_tを使用するのが理にかなっています。移植性のために、SIZE_MAX、SSIZE_MAX、sizeof(type-in​​-your-buffer)および%zdまたは%zuprintf()を使用します。

于 2009-11-08T16:40:13.673 に答える
1

また、off_tとptrdiff_t / ssize_tもあります。これらは、同じようにアーキテクチャ間で異なります。

それらを正しく使用すれば、アーキテクチャ間で移植可能です。32ビットシステムでは、すべて32ビット幅になりますが、64ビットシステムでは、すべて64ビット幅になります。これはあなたが望むものです-バッファのサイズは、32ビットシステムでは32ビットsize_tより大きくすることはできませんが、64ビットシステムでははるかに大きくすることができます。

ints、longs、またはその他のものは絶対に使用しないでください。それ以外の場合、longのサイズはプラットフォームによって異なります(ほとんどの32ビットシステムでは32ビット、64ビットUnixシステムでは64ビット、64ビットWindowsでは32ビット)。

于 2009-11-08T16:46:50.837 に答える
1

この場合、「ポータブル」が何を意味するのかを理解するのは困難です。「ポータブル」という用語には、複数の大幅に異なる解釈が可能です。

size_t非常に具体的な目的があります。指定された実装内の任意のオブジェクトのサイズを保持できます。sizeofつまり、常に演算子の結果を受け取ることができる型です。size_t他の目的はなく、意図したアプリケーション内で、100% 移植可能です。

あなたが求めている「ポータブル」の種類は、繰り返しますが明確ではありません。

于 2009-11-08T16:51:26.287 に答える
0

size_tを何に使用しているかによって異なります。

size_tは任意のコンピュータのメモリ全体をアドレス指定するのに十分な大きさであるため、これを使用してメモリバッファのサイズを決定する場合は安全です。したがって、メモリバッファがそれよりも大きい場合は、とにかく問題が発生します。

一方、たとえば宇宙の星の数を数えるために一般的な符号なし整数として使用する場合、32ビットシステムで問題が発生する可能性があります(64ビットシステムについてはよくわかりません)。

于 2009-11-08T16:46:04.660 に答える
-2

これに関する唯一の深刻な問題は、かなり大きな配列または size_t の大きな数にアクセスしようとすることです。

64 ビットでは通常の "int" で十分かもしれませんが、32 ビット システムの int には大きすぎるため、32 ビットではクラッシュを引き起こす可能性があります。

于 2009-11-08T16:28:48.213 に答える