size_tの定義はどこにありますか?


123

このタイプで定義された変数が表示されますが、それがどこから来たのかもわかりません。intまたはunsigned intを使用しないのはなぜですか?(他の「類似した」タイプはどうですか?Void_tなど)。



@kjfletch:hhhmmm、「前に行ったように」「size_t」という用語を検索してもその質問が返されなかったのは奇妙です。
Eliseo Ocampos 2009

1
@Eliseo-Stackoverflowの検索機能はひどいです。代わりに、「site:stackoverflow.com」パラメーターを指定してGoogleを使用してください。
マイケルバー

8
OP は、size_tの定義はどこにありますか?私は同じことを探してここに上陸しました。引用されたdupは、宣言がどこにあるかについては触れていません。
jww 2015

9
この質問は明らかにリンクされたものと同じ質問ではありません。 「どこで見つけるか」は、「違いは何ですか」と同じではありません(一方の答えがもう一方の答えを提供する場合でも)。「c ++ where is size_t definition」をGoogleで検索したところ、すぐにわかりました。他の質問とは違います。
Dan Nissenbaum

回答:


122

ウィキペディアから

stdlib.hそしてstddef.h、ヘッダファイルと呼ばれるデータ型定義するsize_t1オブジェクトの大きさを表すために使用されます。サイズをとるライブラリ関数は、それらがタイプsize_tであることを期待し、sizeof演算子はに評価されsize_tます。

の実際のタイプsize_tはプラットフォームに依存します。一般的な誤りはsize_t、特に64ビットアーキテクチャが普及するにつれて、プログラミングエラーにつながる可能性があるunsigned intと同じであると仮定することです2

C99 7.17.1 / 2

次のタイプとマクロが標準ヘッダーで定義されています stddef.h

<切り取り>

size_t

これは、sizeof演算子の結果の符号なし整数型です


2
たとえば、Win64ではintunsigned intタイプは32ビットですが、size_tは64ビットです。
マイケルバー

7
ISO C(99)標準(C ++標準に含まれる)セクション7.17および7.18.3を参照してください
Martin York

3
@LokiAstari標準でどこに書かれているかわかっているので、なぜ答えを編集しないのですか?
Hi-Angel

では、C ++の答えはどこにありますか?
Lothar 2017年

@Lothar唯一の違いは、size_tがキーワードであり、それ以外は同じ意味を持つことです。
Paul Stelian 2018年

30

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>

2
これはまさに私が必要とするものであり、この答えは賛成されるべきです。
neodelphi 2017

27

size_t sizeof演算子の結果の符号なし整数型です(ISO C99セクション7.17)。

sizeofオペレータは、発現またはタイプの括弧名前であってもよい、そのオペランドのサイズ(バイト単位)をもたらします。サイズは、オペランドのタイプから決定されます。結果は整数です。結果の値は実装定義であり、その型(符号なし整数型)はsize_t(ISO C99セクション6.5.3.4)です。


それは標準を引用しているので最良の答えです。
マーティンヨーク

1
@Martin-十分に真実ですが、質問の「なぜunsigned intが使用されないのか」の部分は「size_tとは何か」と同じくらい興味深い(またはそれ以上)と思います。標準ではそれはわかりません。
マイケルバー

ええ、「セクション17.17」がないことを除いて:p。それはまれです、誰もVoid_tについて一言も言わなかった
Eliseo Ocampos 09/07/14

質問に直接回答するので、この回答を受け入れますが、Michaelの回答でほめられたら素晴らしいと思います。
Eliseo Ocampos 2009

58
残念ながら、あなたの答えは、どのヘッダーファイルを含めるかを教えてくれません。
マット

6

実際にsize_tは、アドレス指定できるバイト数を表します。過去10〜15年間、32ビットであったほとんどの最新のアーキテクチャでは、unsigned intのサイズでもありました。ただし、64ビットアドレッシングに移行していますが、32ビットのままであるuint可能性が最も高くなります(そのサイズはc ++標準では保証されていません)。メモリサイズに依存するコードをアーキテクチャ間で移植できるようにするには、を使用する必要がありsize_tます。たとえば、配列のサイズなどは常にを使用する必要がありますsize_t。標準のコンテナを見ると、::size()常にが返されますsize_t

また、Visual Studioには、「64ビットの移植性の問題の検出」と呼ばれるこれらのタイプのエラーをチェックできるコンパイルオプションがあります。


2

この方法では、特定のタイプがサイズ専用であるため、常にサイズが何であるかを知ることができます。それが問題になることができることを非常に自身の質問のショーは:それはありますintunsigned int?また、大きさは何である(shortintlong、など)?

特定の型が割り当てられているため、長さや符号の有無を気にする必要はありません。

実際の定義は、C ++リファレンスライブラリにあります。

タイプ:(size_t符号なし整数型)

ヘッダ: <cstring>

size_t言語演算子によって返される整数データ型に対応し、(特に)ヘッダーファイルで符号なし整数型としてsizeof定義され<cstring>ます。

<cstring>、それはパラメータのタイプとして使用されるnum機能でmemchrmemcmpmemcpymemmovememsetstrncatstrncmpstrncpy及びstrxfrm、全ての場合において、バイトまたは機能が影響しなければならない文字の最大数を指定するために使用されます。

またための戻り型として使用されstrcspnstrlenstrspn及びstrxfrmリターンサイズと長さに。


2

size_tは、標準ライブラリのヘッダーで定義する必要があります。私の経験では、通常、それは単にunsigned intのtypedefです。ただし、ポイントはそうである必要はないということです。size_tのようなタイプを使用すると、標準ライブラリベンダーは、プラットフォームに適切な場合、基になるデータタイプを自由に変更できます。size_tが常にunsigned int(キャストなど)であると想定している場合、ベンダーがsize_tを64ビット型などに変更すると、将来問題が発生する可能性があります。このため、このライブラリタイプまたは他のライブラリタイプについて何かを想定することは危険です。


1

私はvoid_tGoogle検索の結果以外はよく知りません(AT&T ResearchのKiem-Phong Voのライブラリで使用されていvmallocます -他のライブラリでも使用されていると思います)。

さまざまなxxx_t typedefは、特定の明確な実装から型を抽象化するために使用されます。これは、特定のものに使用される具体的な型がプラットフォームごとに異なる可能性があるためです。例えば:

  • size_tは、オブジェクトのサイズを保持するために使用される型を抽象化します。これは、一部のシステムではこれが32ビット値になる場合と、16ビットまたは64ビットになる場合があるためです。
  • Void_tキーワードが存在しないvmallocANSI / ISO Cより前のシステムで動作するように作成されているため、ライブラリルーチンによって返されるポインタのタイプを抽象化しますvoid。少なくともそれは私が推測することです。
  • wchar_t ワイド文字に使用されるタイプを抽象化します。これは、一部のシステムでは16ビットタイプ、他のシステムでは32ビットタイプになるためです。

したがってwchar_t、たとえばの代わりにタイプを使用するようにワイド文字処理コードを記述する場合unsigned short、そのコードはおそらくさまざまなプラットフォームに移植しやすくなります。


これは私が探していたものの一部です。私はfpmurphyの答えでコメントで言ったように(あなたは多分あなたはそれを編集することができます気にしない場合)、この答えを補完できることは素晴らしいことだ:)
エリセオOcampos

1

size_t一部のインクルードで「偶然」に定義が読み込まれなかったミニマルなプログラムで、あるコンテキスト(たとえばにアクセスするstd::vector<double>)でそれがまだ必要な場合は、そのコンテキストを使用て正しいタイプを抽出します。例えばtypedef std::vector<double>::size_type size_t

namespace {...}必要に応じて範囲を制限するために囲んでください。)


1

「なぜintまたはunsigned intを使用しないのですか?」については、単に意味的に意味がないためです。もちろん、それがtypedefd である可能性がありint、その後long誰にでもコードを変更しなくても、後でアップグレードできるという実際的な理由がありますが、根本的に、型は意味があるはずです。非常に単純化するために、型の変数はsize_ttime_t時間の値を含むのに適しているのと同じように、もののサイズを含むのに適しており、それに使用されます。これらが実際にどのように実装されるかは、実装の仕事であるはずです。すべてを呼び出すだけの場合と比べてint、このような意味のある型名を使用すると、豊富な型のセットと同様に、プログラムの意味と意図を明確にすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.