GCC 4.4.1、C99
を使用しsize_t
てsize_t
おり、unsigned int
. ただし、32 ビットまたは 64 ビットのどちらを実行しているかによって異なります。
size_t
バッファのサイズを格納するために使用します。
したがって、アーキテクチャ間で使用する場合、これはあまり移植性がないと思います。
size_t
32ビットまたは64ビットで使用する場合の質問です。最も深刻な問題を引き起こすのはどのような状況ですか?
GCC 4.4.1、C99
を使用しsize_t
てsize_t
おり、unsigned int
. ただし、32 ビットまたは 64 ビットのどちらを実行しているかによって異なります。
size_t
バッファのサイズを格納するために使用します。
したがって、アーキテクチャ間で使用する場合、これはあまり移植性がないと思います。
size_t
32ビットまたは64ビットで使用する場合の質問です。最も深刻な問題を引き起こすのはどのような状況ですか?
size_t
実装上の任意のオブジェクトのバイト数を保持できることが保証されています。そのため、の戻りタイプはsizeof
ですsize_t
。
そうです、それはポータブルです。
他の人が言ったように、表現可能なオブジェクトの結果またはサイズをバイト単位size_t
で格納するために正しく、完全に受け入れられます。sizeof()
気をつけなければならないことは、次のとおりです。
size_t
符号なし整数型と同じサイズです。unsigned int
、unsigned long
、 などの最大の符号なし整数型と必ずしも同じバイト数ではありません。sizeof(size_t)
実装で定義されたバイト数であるため、それをmemcpy
'ing または 以外の整数型に代入することuintmax_t
は悪い考えです。と同じかそれより小さいと仮定するのが安全かどうかさえ確信が持てませんuintmax_t
。size_t
バイナリ ファイルに値を書き込んで、別のプロセス、別のマシン、または別のコンパイラ オプションでコンパイルされたものによって値を読み戻すことは、size_t
健康に害を及ぼす可能性があります。size_t
ネットワークを介して値を送信sizeof(size_t)
し、反対側のバッファを使用してそれを受信しようとするのは、かなり安全ではありません。これらはすべて、 を除く他の整数型の標準的な問題unsigned char
です。そのsize_t
ため、他の整数型と同じように移植性があります。
malloc()またはread()を使用している場合は、バッファーにsize_tまたはssize_tを使用するのが理にかなっています。移植性のために、SIZE_MAX、SSIZE_MAX、sizeof(type-in-your-buffer)および%zdまたは%zuprintf()を使用します。
また、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ビット)。
この場合、「ポータブル」が何を意味するのかを理解するのは困難です。「ポータブル」という用語には、複数の大幅に異なる解釈が可能です。
size_t
非常に具体的な目的があります。指定された実装内の任意のオブジェクトのサイズを保持できます。sizeof
つまり、常に演算子の結果を受け取ることができる型です。size_t
他の目的はなく、意図したアプリケーション内で、100% 移植可能です。
あなたが求めている「ポータブル」の種類は、繰り返しますが明確ではありません。
size_tを何に使用しているかによって異なります。
size_tは任意のコンピュータのメモリ全体をアドレス指定するのに十分な大きさであるため、これを使用してメモリバッファのサイズを決定する場合は安全です。したがって、メモリバッファがそれよりも大きい場合は、とにかく問題が発生します。
一方、たとえば宇宙の星の数を数えるために一般的な符号なし整数として使用する場合、32ビットシステムで問題が発生する可能性があります(64ビットシステムについてはよくわかりません)。
これに関する唯一の深刻な問題は、かなり大きな配列または size_t の大きな数にアクセスしようとすることです。
64 ビットでは通常の "int" で十分かもしれませんが、32 ビット システムの int には大きすぎるため、32 ビットではクラッシュを引き起こす可能性があります。