web-dev-qa-db-ja.com

intのサイズはコンパイラーやプロセッサーに依存しますか?

整数のサイズは、コンパイラ、OS、およびプロセッサに依存しますか?

67
Vijay

この質問への答えは、実際の考慮事項からどれだけ遠ざかるかに依存します。

最終的に、理論的には、CおよびC++のすべてはコンパイラーに依存し、コンパイラーのみに依存します。ハードウェア/ OSはまったく重要ではありません。コンパイラは、any thicknessのハードウェアアブストラクションレイヤーを自由に実装し、完全にエミュレートします。言語標準で指定された最小要件を満たすのに十分な大きさである限り、CまたはC++実装が任意のサイズおよび表現でint型を実装することを妨げるものはありません。このようなレベルの抽象化の実用的な例は、すぐに利用できます。 Javaのような「仮想マシン」プラットフォームに基づいたプログラミング言語。

ただし、CおよびC++は、高度な効率的言語であることが意図されています。最大の効率を達成するために、CまたはC++の実装では、基礎となるハードウェアから派生した特定の考慮事項を考慮する必要があります。そのため、各基本タイプがハードウェアで直接(またはほぼ直接)サポートされる表現に基づいていることを確認することは非常に理にかなっています。その意味で、基本型のサイズはハードウェアに依存します。

言い換えると、64ビットハードウェア/ OSプラットフォーム用の特定のCまたはC++実装は、intを128ビットのメモリを占有する71ビットの1の補数の符号付き整数型として完全に自由に実装できます。コンパイラ作成者のガールフレンドの生年月日を格納するために常に必要なパディングビットとしての他の57ビット。この実装には特定の実用的な価値さえあります。C/ C++プログラムの移植性の実行時テストを実行するために使用できます。しかし、その実装の実用的な有用性が終了する場所です。 「通常の」C/C++コンパイラでそのようなものを期待しないでください。

117
AnT

はい、それは両方のプロセッサ(より具体的には、ISA、命令セットアーキテクチャ、x86とx86-64など)およびプログラミングモデルを含むコンパイラに依存します。たとえば、16ビットマシンでは、sizeof(int)は2バイトでした。 32ビットマシンでは、intに4バイトが使用されます。 intnativeプロセッサのサイズ、つまりレジスタのサイズであると見なされています。ただし、32ビットコンピューターは非常に人気があり、32ビットプログラミングモデル用に膨大な数のソフトウェアが記述されています。したがって、64ビットコンピューターにintの8バイトがある場合、非常に混乱します。 LinuxとWindowsは、intに対して4バイトのままです。ただし、longのサイズは異なります。

ほとんどの* nixについてはLP64およびWindowsについてはLLP64のような64ビットプログラミングモデルをご覧ください。

このような違いは、WindowとLinuxの両方で動作するコードを記述する場合、実際には非常に恥ずかしいです。そのため、 stdint.h 経由で、longではなく、常にint32_tまたはint64_tを使用しています。

32
minjang

はい、そうです。 「コンパイラまたはプロセッサに依存する」という意味ですか?その場合、答えは基本的に「両方」です。通常、intはプロセッサレジスタより大きくなりません(16ビットより小さい場合を除く)が、小さくすることもできます(たとえば、64ビットプロセッサで実行される32ビットコンパイラ)。ただし、一般的に、64ビット整数でコードを実行するには64ビットプロセッサが必要です。

7
Jerry Coffin

いくつかの最近の調査に基づいて、ファームウェアのインタビューを調査しました。

プロセッサのビットアーキテクチャ、つまり8ビット、16ビット、32ビット、64ビットの最も大きな影響は、最小サイクル数で変数を最適に計算するために情報の各バイトを最も効率的に格納する方法です。

プロセッサのビットサイズにより、CPUが1サイクルで処理できる自然なWordの長さがわかります。 32ビットマシンは、メモリ内で適切に配置されている場合、64ビットダブルを処理するために2サイクルを必要とします。ほとんどのパーソナルコンピュータは32ビットであり、現在も32ビットであるため、Cコンパイラが32ビット整数と、より大きな浮動小数点数と長いlong intのオプションとの典型的な親和性の最も可能性の高い理由です。

明らかに、より大きな変数サイズを計算できるので、その意味で、CPUのビットアーキテクチャは、処理の可能な限り最高の効率を達成するために、より大きな変数と小さな変数を格納する方法を決定しますが、バイトサイズの定義における制限要因ではありませんintまたはcharの場合、これはコンパイラーの一部であり、慣習または標準で規定されているものです。

このサイトは非常に有用であることがわかりました http://www.geeksforgeeks.org/archives/9705 、CPUの自然な単語の長さが、大小の変数タイプの格納と処理の選択にどのように影響するかを説明するために、特に構造体へのビットパッキングに関して。 CPUのワード長で割ったときに最小のサイクル数になるように、より大きな変数をメモリ内で整列させる必要があるため、変数の割り当て方法を非常によく認識している必要があります。これにより、変数の割り当てが適切に行われていない場合、構造体などに不必要に多くのバッファ/空のスペースが追加されます。

6
SCW

簡単で正しい答えは、コンパイラに依存するということです。アーキテクチャが無関係であることを意味するものではありませんが、アプリケーションではなくコンパイラがそれを処理します。より正確に言うと、たとえば32ビットまたは64ビットの場合、コンパイラの(ターゲット)アーキテクチャに依存します。

intに加えて他のものを書き込むファイルを作成するWindowsアプリケーションがあるとします。 32ビットと64ビットの両方のウィンドウでこれを実行するとどうなりますか? 32ビットシステムで作成されたファイルをコピーし、64ビットシステムで開くとどうなりますか?

Intのサイズは各ファイルで異なると思うかもしれませんが、それらは同じではなく、これが問題の核心です。コンパイラの設定を選択して、32ビットまたは64ビットアーキテクチャをターゲットにし、それがすべてを決定します。

2
zar

データ型のサイズは基本的にコンパイラのタイプに依存し、コンパイラはプロセッサのアーキテクチャに基づいて設計されているため、外部ではデータ型はコンパイラに依存すると見なすことができます。たとえば、整数のサイズは16ビットtcコンパイラでは2バイトですが、4バイトgccコンパイラでは同じプロセッサで実行されますが

0
mukesh

http://www.agner.org/optimize/calling_conventions.pdf

「3データ表現」には、コンパイラが整数型で行うことの概要が含まれています。

0
bruziuz

Intのサイズは、基礎となるISAに依存するワード長に等しくなります。プロセッサはISAのハードウェア実装であり、コンパイラはISAのソフトウェア側実装です。すべてが基礎となるISAを中心に展開します。最も一般的なISA =最近のIntelのIA-32です。ワード長は32ビットまたは4バイトです。4バイトは、 'int'(短いまたは長いではなく単なるint)コンパイラの最大サイズになる可能性があります。 。

0
KawaiKx

コンパイラはCPUが次のバイトにアクセスしやすくするため、データ型のサイズはプロセッサに依存します。例えば:プロセッサーが32ビットの場合、コンパイラーはintサイズを2バイト[4バイトを選択することになっている]として選択しない場合があります。コンパイラがintを4バイトとして選択した場合、CPUは1回のショットで4バイトすべてにアクセスできるため、アプリケーションが高速化されます。

ありがとう

0
mahesh