このタイプで定義された変数が表示されますが、それがどこから来たのかもわかりません。intまたはunsigned intを使用しないのはなぜですか?(他の「類似した」タイプはどうですか?Void_tなど)。
このタイプで定義された変数が表示されますが、それがどこから来たのかもわかりません。intまたはunsigned intを使用しないのはなぜですか?(他の「類似した」タイプはどうですか?Void_tなど)。
回答:
ウィキペディアから
stdlib.h
そしてstddef.h
、ヘッダファイルと呼ばれるデータ型定義するsize_t
1オブジェクトの大きさを表すために使用されます。サイズをとるライブラリ関数は、それらがタイプsize_t
であることを期待し、sizeof演算子はに評価されsize_t
ます。の実際のタイプ
size_t
はプラットフォームに依存します。一般的な誤りはsize_t
、特に64ビットアーキテクチャが普及するにつれて、プログラミングエラーにつながる可能性があるunsigned intと同じであると仮定することです2。
次のタイプとマクロが標準ヘッダーで定義されています
stddef.h
<切り取り>
size_t
これは、sizeof演算子の結果の符号なし整数型です
int
、unsigned int
タイプは32ビットですが、size_tは64ビットです。
en.cppreference.comのsize_tの説明に よるとsize_t
、次のヘッダーで定義されています。
std::size_t
...
Defined in header <cstddef>
Defined in header <cstdio>
Defined in header <cstring>
Defined in header <ctime>
Defined in header <cwchar>
size_t
sizeof演算子の結果の符号なし整数型です(ISO C99セクション7.17)。
sizeof
オペレータは、発現またはタイプの括弧名前であってもよい、そのオペランドのサイズ(バイト単位)をもたらします。サイズは、オペランドのタイプから決定されます。結果は整数です。結果の値は実装定義であり、その型(符号なし整数型)はsize_t
(ISO C99セクション6.5.3.4)です。
実際にsize_t
は、アドレス指定できるバイト数を表します。過去10〜15年間、32ビットであったほとんどの最新のアーキテクチャでは、unsigned intのサイズでもありました。ただし、64ビットアドレッシングに移行していますが、32ビットのままであるuint
可能性が最も高くなります(そのサイズはc ++標準では保証されていません)。メモリサイズに依存するコードをアーキテクチャ間で移植できるようにするには、を使用する必要がありsize_t
ます。たとえば、配列のサイズなどは常にを使用する必要がありますsize_t
。標準のコンテナを見ると、::size()
常にが返されますsize_t
。
また、Visual Studioには、「64ビットの移植性の問題の検出」と呼ばれるこれらのタイプのエラーをチェックできるコンパイルオプションがあります。
この方法では、特定のタイプがサイズ専用であるため、常にサイズが何であるかを知ることができます。それが問題になることができることを非常に自身の質問のショーは:それはありますint
かunsigned int
?また、大きさは何である(short
、int
、long
、など)?
特定の型が割り当てられているため、長さや符号の有無を気にする必要はありません。
実際の定義は、C ++リファレンスライブラリにあります。
タイプ:(
size_t
符号なし整数型)ヘッダ:
<cstring>
size_t
言語演算子によって返される整数データ型に対応し、(特に)ヘッダーファイルで符号なし整数型としてsizeof
定義され<cstring>
ます。で
<cstring>
、それはパラメータのタイプとして使用されるnum
機能でmemchr
、memcmp
、memcpy
、memmove
、memset
、strncat
、strncmp
、strncpy
及びstrxfrm
、全ての場合において、バイトまたは機能が影響しなければならない文字の最大数を指定するために使用されます。またための戻り型として使用され
strcspn
、strlen
、strspn
及びstrxfrm
リターンサイズと長さに。
size_tは、標準ライブラリのヘッダーで定義する必要があります。私の経験では、通常、それは単にunsigned intのtypedefです。ただし、ポイントはそうである必要はないということです。size_tのようなタイプを使用すると、標準ライブラリベンダーは、プラットフォームに適切な場合、基になるデータタイプを自由に変更できます。size_tが常にunsigned int(キャストなど)であると想定している場合、ベンダーがsize_tを64ビット型などに変更すると、将来問題が発生する可能性があります。このため、このライブラリタイプまたは他のライブラリタイプについて何かを想定することは危険です。
私はvoid_t
Google検索の結果以外はよく知りません(AT&T ResearchのKiem-Phong Voのライブラリで使用されていvmalloc
ます -他のライブラリでも使用されていると思います)。
さまざまなxxx_t typedefは、特定の明確な実装から型を抽象化するために使用されます。これは、特定のものに使用される具体的な型がプラットフォームごとに異なる可能性があるためです。例えば:
Void_t
キーワードが存在しないvmalloc
ANSI / ISO Cより前のシステムで動作するように作成されているため、ライブラリルーチンによって返されるポインタのタイプを抽象化しますvoid
。少なくともそれは私が推測することです。wchar_t
ワイド文字に使用されるタイプを抽象化します。これは、一部のシステムでは16ビットタイプ、他のシステムでは32ビットタイプになるためです。したがってwchar_t
、たとえばの代わりにタイプを使用するようにワイド文字処理コードを記述する場合unsigned short
、そのコードはおそらくさまざまなプラットフォームに移植しやすくなります。
「なぜintまたはunsigned intを使用しないのですか?」については、単に意味的に意味がないためです。もちろん、それがtypedef
d である可能性がありint
、その後long
誰にでもコードを変更しなくても、後でアップグレードできるという実際的な理由がありますが、根本的に、型は意味があるはずです。非常に単純化するために、型の変数はsize_t
、time_t
時間の値を含むのに適しているのと同じように、もののサイズを含むのに適しており、それに使用されます。これらが実際にどのように実装されるかは、実装の仕事であるはずです。すべてを呼び出すだけの場合と比べてint
、このような意味のある型名を使用すると、豊富な型のセットと同様に、プログラムの意味と意図を明確にすることができます。