web-dev-qa-db-ja.com

64ビットアプリケーションのメモリ使用量のオーバーヘッドはどのくらいですか?

これまでに発見したことから、64ビットアーキテクチャ用にコンパイルされたプログラムは、32ビットの代替手段の2倍のポインタにRAMをポインタに使用していることは明らかです https:// superuser .com/questions/56540/32-bit-vs-64-bit-systems

これは、64ビット用にコンパイルされたコードが32ビットバージョンよりも平均で2倍 [〜#〜] ram [〜#〜] を使用することを意味しますか?

どういうわけか私はそれを疑うが、私は本当のオーバーヘッドが何であるか疑問に思っています。 shortbytecharのような小さな型は、64ビットアーキテクチャで同じサイズであると思いますか? byteについてはよくわかりません。多くのアプリケーションは、ほとんどの実装でchar配列で主に構成される大きな文字列(Webブラウザーなど)で動作するため、オーバーヘッドはそれほど大きくない場合があります。

したがって、intlongのような数値型が64ビットで大きい場合でも、RAMの使用に大きな影響を与えるでしょうか?

44
Petr

それはプログラミングスタイルに依存します(そして言語にも依存しますが、Cを参照しています)。

  • ポインターを多く使用する場合(または一部の言語では参照が多い場合)、RAM消費量が増加します。
  • doubleint32_tなどの固定サイズの大量のデータを使用する場合、RAM消費量は増えません。
  • intlongのような型の場合、それはアーキテクチャに依存します。 LinuxとWindowsでは違いがあるかもしれません。 ここ 代替案が表示されます。つまり、WindowsはLLP64を使用します。つまり、long longとポインターは64ビットですが、LinuxはLP64を使用しますが、longも64ビットです。他のアーキテクチャではintまたはshortも64ビットにする可能性がありますが、これらは非常にまれです。
  • floatdoubleは、すべての場合でサイズが同じである必要があります。

したがって、データ型の使用法に強く依存していることがわかります。

42
glglgl

メモリ消費量が増加する理由はいくつかあります。ただし、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++を使用しています。

26
VAndrei

バイトで読み取る必要がない場合は、変数を64ビット境界のメモリの1バイトで読み取るアドレスであるxxxxx000に格納する必要があるという、別の理由があると思います。一度に。

0
John