C++ の size_t と int の違いは何ですか?
質問
いくつかの C++ の例では、単純な int を使用するはずの場所で、size_t 型が使用されていることがわかります。違いは何ですか? なぜ size_t の方が優れているのでしょうか?
解決
STDLIB.HとSTDDEF.Hヘッダファイルは、オブジェクトの大きさを表すために使用されているのsize_t型のと呼ばれるデータ型を定義します。サイズを取るライブラリ関数は、彼らがsize_t型であることを期待し、sizeof演算子は、size_t型に評価されます。
size_t型の実際の型は、プラットフォーム依存です。一般的な誤りは、size_tの64ビットアーキテクチャは、より普及特にとして、プログラミングエラーにつながる可能性がunsigned int型、同じであると仮定することである。
また、チェックなぜsize_tの事項
他のヒント
size_tのは、(その名前が示すように)サイズを表すために使用されるタイプです。そのプラットフォーム(とさえ潜在的に実装)に依存する、とは、この目的のためだけに使用する必要があります。もちろん、サイズを表す、size_t型は、符号なしです。 malloc関数、はsizeof及び各種文字列操作機能を含む多くのSTDLIB関数は、データ型としてsize_tの使用。
int型はデフォルトで署名され、そのサイズもプラットフォームに依存しているにもかかわらず、それは最も近代的なマシン上の固定32ビットになります(とsize_tのは、64ビットアーキテクチャ上で64ビットですが、int型は、これらのアーキテクチャ上で32ビットの長残ります)。
要約する:オブジェクトとINT(又は長さ)の大きさを表すためにsize_t型を使用し、他の場合には
。それはです。アイデアは、それが基になる型から仕事だ切り離すことです。
size_t
タイプはsizeof
オペレータの符号なし整数型として定義されています。現実の世界では、あなたが頻繁にint
は(下位互換性のために)32ビットとして定義されているが64ビットとしてsize_t
定義されて表示されます、64ビット・プラットフォーム上の(あなたが配列や構造体のサイズ以上4ジブを宣言することができます)。 long int
も64ビットである場合、これはLP64大会と呼ばれています。 long int
が32ビットであるが、long long int
とポインタは64ビットである場合、それはLLP64です。また逆の、メモリを節約するためにスピードのための64ビット命令が、32ビット・ポインタを使用するプログラムを取得する可能性があります。また、int
が署名し、size_t
が符号なしでされます。
アドレスはint
の本来のサイズより広いか短かった他のプラットフォームの数は、歴史的にありました。実際には、70年代と80年代初期には、これがないよりも一般的だった:すべての一般的な8ビット・マイコンは、8ビットのレジスタと16ビットのアドレスを持っていたし、16ビットと32ビット間の遷移はまた、多くのマシンを作成しましたそのレジスタより広いアドレスを持っていました。私は時折、まだ巨大なメモリモードは、16ビットCPU上で32ビットに格納された20ビットのアドレスを有していた(ただし、80386の32ビット命令セットをサポートする可能性がある)MS-DOSのためのBorlandターボCについてここで質問を参照します。モトローラ68000は、32ビットのレジスタとアドレスを持つ16ビットALUを有していました。 15ビット、24ビットまたは31ビットのアドレスを持つIBMメインフレームがありました。あなたはまた、まだ組み込みシステムで異なるALUとアドレスバスのサイズを参照してください。
任意の時間int
がsize_t
よりも小さい、とあなたはunsigned int
で非常に大きなファイルまたはオブジェクトのサイズやオフセットを保存しようと、それはバグをオーバーフローさせ、引き起こす可能性がある可能性があります。 int
では、負の数を取得する可能性もあります。 int
またはunsigned int
が広い場合、プログラムが正しく実行されますが、廃棄物のメモリます。
あなたは、一般的な目的のために適切なタイプを使用する必要があります。多くの人が(1U < -3
のような厄介な、微妙なバグを避けるために)あなたが代わりに符号なしの署名数学を使用することをお勧めします。その目的のために、標準ライブラリは、別のポインタを減算した結果の符号付き型としてptrdiff_t
に<stddef.h>
を定義します。
これは回避策がINT_MAX
と0
またはINT_MIN
のいずれかに対するすべてのアドレスとオフセットは、必要に応じて、あなたがいずれかを欠場する場合には符号付きと符号なしの量を比較に関するコンパイラの警告をオンにし、チェックの境界にあるかもしれない、と述べました。あなたは、常に、常に、常にあなたの配列は、とにかくCでのオーバーフローのためにアクセスをチェックする必要があります。
の定義 SIZE_T
は次の場所にあります。https://msdn.microsoft.com/en-us/library/cc441980.aspx そして https://msdn.microsoft.com/en-us/library/cc230394.aspx
必要な情報をここに貼り付けます:
SIZE_T
です ULONG_PTR
ポインタが指すことができる最大バイト数を表します。
この型は次のように宣言されます。
typedef ULONG_PTR SIZE_T;
あ ULONG_PTR
ポインターの精度に使用される unsigned long 型です。ポインタ演算を実行するためにポインタをlong型にキャストするときに使用されます。
この型は次のように宣言されます。
typedef unsigned __int3264 ULONG_PTR;