これまでに発見したことから、64ビットアーキテクチャ用にコンパイルされたプログラムは、32ビットの代替手段の2倍のポインタにRAMをポインタに使用していることは明らかです https:// superuser .com/questions/56540/32-bit-vs-64-bit-systems 。
これは、64ビット用にコンパイルされたコードが32ビットバージョンよりも平均で2倍 [〜#〜] ram [〜#〜] を使用することを意味しますか?
どういうわけか私はそれを疑うが、私は本当のオーバーヘッドが何であるか疑問に思っています。 short
、byte
、char
のような小さな型は、64ビットアーキテクチャで同じサイズであると思いますか? byte
についてはよくわかりません。多くのアプリケーションは、ほとんどの実装でchar
配列で主に構成される大きな文字列(Webブラウザーなど)で動作するため、オーバーヘッドはそれほど大きくない場合があります。
したがって、int
やlong
のような数値型が64ビットで大きい場合でも、RAMの使用に大きな影響を与えるでしょうか?
それはプログラミングスタイルに依存します(そして言語にも依存しますが、Cを参照しています)。
double
やint32_t
などの固定サイズの大量のデータを使用する場合、RAM消費量は増えません。int
やlong
のような型の場合、それはアーキテクチャに依存します。 LinuxとWindowsでは違いがあるかもしれません。 ここ 代替案が表示されます。つまり、WindowsはLLP64を使用します。つまり、long long
とポインターは64ビットですが、LinuxはLP64を使用しますが、long
も64ビットです。他のアーキテクチャではint
またはshort
も64ビットにする可能性がありますが、これらは非常にまれです。float
とdouble
は、すべての場合でサイズが同じである必要があります。したがって、データ型の使用法に強く依存していることがわかります。
メモリ消費量が増加する理由はいくつかあります。ただし、64bと32bのオーバーヘッドはアプリによって異なります。
主な理由はコードで多くのポインターを使用するです。ただし、64ビット用にコンパイルされ、64ビットOSで実行されているコードで動的に割り当てられた配列は、32ビットシステムで割り当てられた配列と同じサイズになります。配列のアドレスのみが大きくなり、コンテンツサイズは同じになります(型のサイズが変更された場合を除く-ただし、これは発生してはならず、十分に文書化されている)。
別のフットプリントの増加は、memory alignmentが原因です。 64ビットモードでは、アライメントが64ビットアドレスを考慮する必要があるため、小さなオーバーヘッドが追加されます。
おそらくコードのサイズは大きくなりますです。一部のアーキテクチャでは、64ビットISAがわずかに大きくなる場合があります。また、64ビットアドレスを呼び出す必要があります。
実行時64ビットレジスタの方が大きい(64ビット)なので、多くの数値型を使用する場合、コンパイラはそれらをレジスタに配置することもできるため、必ずしもRAMフットプリントを意味するわけではありません上がるだろう。 double変数の使用は、64bレジスタに格納されていない場合、メモリフットプリントが増加する可能性があります。
Java、.NETのようにJITコンパイル済み言語を使用する場合、ランタイム環境がポインターの使用や非表示の制御構造などを通じて追加のオーバーヘッドを生成するため、64bコードのフットプリントの増加が大きくなる可能性があります。
ただし、64ビットのメモリフットプリントのオーバーヘッドを表すマジック番号はありません。アプリケーションごとに測定する必要があります。私が見てきたことから、32ビットと比較して64ビットで実行されているアプリケーションの場合、フットプリントが20%以上増加したことはありません。ただし、これは純粋に私が遭遇したアプリケーションに基づいており、主にCとC++を使用しています。
バイトで読み取る必要がない場合は、変数を64ビット境界のメモリの1バイトで読み取るアドレスであるxxxxx000に格納する必要があるという、別の理由があると思います。一度に。