web-dev-qa-db-ja.com

「int」ではなく「short」を使用する場合

C++のshortint整数型の違いを尋ねる質問はたくさんありますが、実際にはshortよりもintを選択するのはいつですか?

28
dayuloli

(詳細な説明については Ericの答え を参照)

注:

  • 通常、intは「自然なサイズ」に設定されます-ハードウェアが最も効率的に処理する整数形式
  • 配列または算術演算でshortを使用する場合、short整数はintに変換されるため、short整数
  • shortを使用すると、intよりも狭い場合にメモリを節約できます。これは、大きな配列を使用する場合に重要になる可能性があります。
  • 16ビットintシステムと比較して、プログラムは32ビットintシステムでより多くのメモリを使用します

結論:

  • メモリの保存が重要でない場合、またはプログラムが大量のメモリ(たとえば、多くの配列)を使用する場合を除き、intを使用します。その場合は、shortを使用します。
36
dayuloli

次の場合は、shortよりもintを選択します。

どちらか

  • 格納する値のメモリフットプリントを減らしたい(たとえば、メモリの少ないプラットフォームをターゲットにしている場合)
  • 単一のメモリページにパックできる値の数を増やして(値にアクセスするときのページフォールトを減らす)、メモリキャッシュ内に値をアクセスする(値にアクセスするときのキャッシュミスを減らす)ことで、パフォーマンスを向上させたいここでパフォーマンスの向上が得られること、
  • または、ネットワーク経由でデータを送信またはディスクに保存していて、フットプリントを削減したい(ディスクスペースまたはネットワーク帯域幅をより少なくしたい)。ただし、これらの場合は、intまたはshortではなく、ビット単位でサイズを正確に指定する型を選択する必要があります(プラットフォームに応じて異なる場合があります(32ビットのshortを備えたプラットフォームで、 16ビットshortのプラットフォーム)。適切な候補は、 stdint.h で定義されているタイプです。

そして:

  • ターゲットプラットフォーム上のshortに格納できない値を取る必要がない数値があります(16ビットのshortの場合、これは-32768-32767、または0-65535 16ビットの場合unsigned short)。
  • ターゲットプラットフォーム(またはターゲットプラットフォームの1つ)は、shortよりもintの方が少ないメモリを使用します。標準では、shortintより大きくないことのみが保証されているため、実装は、shortintで同じサイズを使用できます。

注:

charsは算術型としても使用できます。 charまたはshortの代わりにintを使用する必要がある場合」への回答は、これと非常によく似ていますが、異なる番号(-128-127 8ビットのcharの場合、0-255は8ビットunsigned char

現実には、short型を具体的に使用したくないでしょう。特定のサイズの整数が必要な場合は、タイプがあります <cstdint> 優先する必要があります。たとえば、int16_tはすべてのシステムで16ビットになりますが、shortのサイズが、コードがコンパイルされるすべてのターゲットで同じであることを保証することはできません。

17
Eric Finn

一般的に、shortよりもintを好むことはありません。

int型はプロセッサのネイティブWordサイズです
通常、intはプロセッサのWordサイズです。

たとえば、32ビットのワードサイズのプロセッサでは、intは32ビットになります。プロセッサは、32ビットを使用すると最も効率的です。 shortが16ビットであると仮定すると、プロセッサはメモリから32ビットをフェッチします。ここでは効率がありません。プロセッサが32ビットWordの正しい位置に配置されるようにビットをシフトする必要があるため、実際には長くなります。

小さいデータ型の選択uint16_tなど、長さがビット固有の標準化されたデータ型があります。これらは、char, short,およびintのあいまいなタイプよりも優先されます。これらの幅固有のデータ型は通常、ハードウェアへのアクセス、またはスペースの圧縮(メッセージプロトコルなど)に使用されます。

より狭い範囲の選択
shortデータ型は、ビット幅ではなく範囲に基づいています。 32ビットシステムでは、shortintの両方が同じ32ビット長である場合があります。

shortを使用する理由の1つは、値が特定の範囲を決して超えないためです。プログラムが変更され、データ型がオーバーフローする可能性があるため、これは通常誤りです。

概要
現在、shortはもう使用していません。 16ビットのハードウェアデバイスにアクセスするときは、uint16_tを使用します。ループインデックスを含む数量にunsigned intを使用します。データストレージのサイズが重要な場合は、uint8_tuint16_t、およびuint32_tを使用します。 shortデータ型は最小であるため、データストレージではあいまいです。 stdintヘッダーファイルの出現により、shortは不要になりました。

8
Thomas Matthews

アーキテクチャによって特定の制約が課せられていない場合は、いつでもintを使用できます。タイプshortは、メモリが貴重なリソースである特定のシステムを対象としています。

0