8

タイトルは最初はばかげているように聞こえるかもしれませんが、しばらくお待ちください。:)

size_tとを使い始めて以来、覚えている限り、をptrdiff_t使ったことはありません。int

最近使用したことを覚えている整数データ型は、次のいずれかに分類されます。

  1. (符号なし)メモリ内データ構造へのインデックスに関連付けられた整数(例vector)。
    ほとんどの場合、これに最も適切なタイプはsize_t(または...::size_type、さらに1マイル進む場合)です。
    整数が実際にインデックスを表していない場合でも、多くの場合、それはまだ何らかのインデックスに関連付けられsize_tているため、適切です。

  2. の署名付きバージョンsize_t。多くの場合、これに最も適したタイプはであるように思われptrdiff_tます。これが必要な場合は、イテレータを使用していることが多いためです。したがってsize_tptrdiff_tどちらもイテレータに適しています。

  3. long_InterlockedIncrement(参照カウント)のために時々これが必要になります。

  4. unsignedlong long、ファイルサイズを保持するために使用されます。

  5. unsigned intまたはunsigned long、「カウント」の目的に役立ちます(たとえば、100万回の反復ごとに、UIを更新します)。

  6. unsigned charメモリへの生のバイトレベルのアクセス用。
    (補足:signed charどちらの用途も見つかりませんでした。)

  7. intptr_tまたuintptr_t、オペレーティングシステムのハンドルやポインタなどをときどき保存するために使用します。

重要なことの1つの特定の側面はint、オーバーフローしてはならないことです(未定義の動作であるため)。したがって、特にコンパイラーが16ビットとして定義している場合は、カウントに確実に使用することさえできません。

それでは、いつ使用する必要がありますかint(あなたの依存関係がすでにそれを必要としている場合を除いて)?
少なくとも新しく書かれたポータブルコードで、今日それを実際に使用することはありますか?

4

4 に答える 4

9

すべての中で最も重要な理由はどうですか-読みやすさ。(そして簡単な数学)

long weeklyHours = daysWorked * hoursPerDay;

「わかりました...しかし、繰り返しになりますが、人間が実際に1週間にどれだけ働くことができ、必要なのかlong

size_t weeklyHours = daysWorked * hoursPerDay;

「待って...weeklyHoursベクトルを反復処理するために使用していますか?」

unsigned int weeklyHours = daysWorked * hoursPerDay;

"十分にクリア。" -どちらかが負になる可能性がある場合のエラーの原因の可能性(ロジックの一部-休暇または休暇を説明する方法である可能性がありますが、重要ではありません)

int weeklyHours = daysWorked * hoursPerDay;

「わかりました、十分に単純です。これが何をしているのかわかります。」

于 2012-12-18T05:16:48.247 に答える
6

Luchianにはいくつかの優れた読みやすさのポイントがあり、それにいくつかの技術的なポイントを追加します。

  • コンパイラはint、処理するのに効率的なサイズを選択することが期待されますが、longそうではない場合があります(操作ごとのCPUサイクルの増加、マシンコードのバイト数の増加、必要なレジスタの増加などのリスクがあります)
  • 符号付きタイプを使用すると、次のようないくつかのエラーを排除できます。
    • abs(a - b)数学的には正しく見えますが、b>aで署名されていない場合、直感的な結果は得られません。
    • int second_delta = (x.seconds - y.seconds) + (x.minutes - y.minutes) * 60;
    • if (pending - completed > 1) kick_off_threads()
  • 整数の番兵値-1が必要な場合によく使用されます。符号なしの型の場合、これは可能な限り最大の値に変換されますが、誤解やコーディングエラーにつながる可能性があります(if (x >= 0)非番兵のテストなど) 。

また、符号付き整数と符号なし整数の間の暗黙的な変換には多くの範囲があります-符号なし型が「非負」の不変条件を強制するのに役立つことはめったにないことを理解することが重要です:それが魅力の一部である場合は、不変条件を適用するコンストラクターと演算子。

読みやすさの面でintは、問題の領域に明確にまたがる数値の一般的な必要性を示します-それは過剰かもしれませんが、マシンコード操作とCPUサイクルで安価であることが知られているので、一般的な統合ストレージの頼りになるタイプです。誰かの年齢を保存するためにsayを使い始めるunsigned charと、それはうまく機能しないだけでなくoperator<<(std::ostream&...)、「ここでメモリを節約する必要があったのか」などの質問をします。(特にスタックベースの変数の場合は混乱します)、「これをI / OまたはIPCの目的でバイナリデータとして扱う意図はありますか?」、または「ASCIIで保存された既知の1桁の年齢ですか?」とにかく何かがレジスターに入る可能性が高い場合intは、自然なサイズ設定です。

于 2012-12-18T05:17:58.910 に答える
0

銀行口座のプログラムを実装していたとしましょう。引き出しが多すぎる場合(一部のアカウントではペナルティがあります)、何らかの方法で負の値を表す必要があります。

于 2012-12-18T05:24:40.210 に答える
0

私はついに自分で良いユースケースを見つけました:

intマップ上のズームレベルなどの整数の対数を格納するのに最適な候補です。

short通常、これには十分な精度がなく(滑らかなマウスホイールの回転は非常に正確である可能性があります)、long通常、必要以上の精度です。
間違いなく負の値が必要なので、符号なしの型を使用しないでください。したがってint、法案に適合します。

于 2014-02-16T23:20:16.613 に答える