64ビットマシンで64ビットの代わりに32ビットソフトウェアを実行する正当な理由はありますか?


56

64ビットハードウェア上で最新の64ビットオペレーティングシステムを実行する、最新のデスクトップマシンを対象としたソフトウェアの64ビットバージョンと共に32ビットバージョンを提供する正当な理由はありますか?

64ビットソフトウェアの方が効率的で、必要に応じてメモリ使用量を増やすことができるようです。Appleは、4 GBをはるかに下回るRAMが1〜2 GBしかなくても、電話に64ビットプロセッサを使用します。 32ビットCPUの制限。


16
必ずしもすべての近代的なマシンは、64ビットOSを実行します
バリント

4
例はありますか?
フィリップHaglund

8
顧客に尋ねてください。
マーフィー

22
修辞的な質問:ほとんどの最新の64ビットオペレーティングシステムでは32ビットと64ビットのアプリケーションも実行できるため、ソフトウェアの64ビットバージョンを提供する理由はありますか?
ドックブラウン

2
重複した@gnatではありません。その質問は、タイムスタンプのフィッティングと、プログラムの終了時に返されるエラーコードの開発者IDに関するものです。
フィリップHaglund

回答:


80

64ビット環境での32ビットソフトウェアの利点

  • 特にポインターが重いアプリケーションでは、64ビットと32ビットのメモリフットプリントが少ないため、メモリ要件が簡単に倍になります。
  • オブジェクトファイルも小さくなります。
  • 32ビット環境との互換性。
  • メモリリークは2 GB、3 GB、または4 GBにハードキャップされており、システム全体を圧迫することはありません。

64ビット環境での32ビットソフトウェアの欠点

  • プロセスごとに2 GB、3 GB、または4 GBのメモリ制限。(プロセスごとに、合計すると、複数の32ビットプロセスが使用可能なシステムメモリをすべて使用する場合があります。)
  • x64に依存する追加のレジスタおよび命令セット拡張を使用しません。これは、コンパイラおよびCPU固有の高度なものです。
  • すべての(ほとんどのLinuxディストリビューション)または一般的ではない(ほとんどのWindowsバージョン)ライブラリおよびランタイム環境の32ビットバージョンが必要になる場合があります。共有ライブラリの32ビットバージョンがアプリケーション専用にロードされ、それがフットプリントにカウントされる場合。静的にリンクしている場合、まったく違いはありません。

その他の側面

  • 通常、ドライバーは問題ではありません。カーネルモジュールのAPIではなく、ユーザー空間ライブラリのみが32ビットと64ビットで異なる必要があります。
  • 整数データ型のデフォルト幅が異なることに注意してください。追加のテストが必要です。
  • 64ビットCPUアーキテクチャでは、32ビットさえもサポートされていない場合があります。
  • 32ビット実行モードでは、物理メモリよりもはるかに大きなアドレス空間に依存するASLRなどの特定の手法はうまく機能しません(またはまったく機能しません)。

ここで非常に具体的なCPUアーキテクチャ、オペレーティングシステム、およびライブラリインフラストラクチャを比較しない限り、詳細を説明することはできません。


8
「64ビットCPUアーキテクチャは、32ビットさえもサポートしていない場合があります。」これは理論上の懸念ですか、それとも世界に存在しますか?
ムカホ

10
@mucaho確かにされているように、AlphaとIA64などの64ビット専用のCPUアーキテクチャ、。ただし、どちらもmo死です。現在作成されている 64ビットのみのアーキテクチャ(AArch64など)があるかどうか、頭の外ではわかりません。32ビットARMがその必須コンポーネントであるかどうかは誰にもわかりますか?
zwol

10
@zwolいいえ、32ビットはARMに必須ではなく、64ビットも必須ではありません。64ビットのみのARM CPUがありますが、32ビットプロセスと64ビットプロセスの両方をサポートするものもあります。
Ext3h

3
単純に1つのアーキテクチャを選択し、それに固執するだけでなく、開発とテストがより簡単になるという追加の利点があります。
jl6

7
@ジョシュアは常に存在しましたか?ファラオはこれを知っていましたか?
candied_orange

7

32ビットソフトウェアと64ビットソフトウェアの違いは、ポインターのサイズと、おそらく整数レジスタのサイズです。それでおしまい。

つまり、プログラム内のすべてのポインターのサイズは2倍になります。(少なくともILP32 / LP64アーキテクチャでは)longsもサイズの2倍です。これにより、通常、オブジェクトコードサイズが約30%増加します。この意味は …

  • オブジェクトコードがディスクからRAMにロードされるまでに最大30%かかります
  • オブジェクトコードはメモリの最大30%の領域を占有します
  • (オブジェクトコードの場合)メモリ帯域幅を実質的に20%削減しました。
  • 命令キャッシュのサイズを実質的に20%削減した

これは、パフォーマンスに無視できない悪影響を及ぼします。

これは、パフォーマンスコストを何らかの方法で「買い戻す」ことができる場合にのみ意味があります。基本的に、これを行うには2つの方法があります。多くの64ビット整数演算を行うか、4 GiByteを超えるメモリをマップする必要があります。これらのいずれかまたは両方が当てはまる場合、64ビットソフトウェアを使用するのが理にかなっていますが、そうでない場合はそうではありません。

注:対応する32ビットまたは64ビットのバリアントがないアーキテクチャもあります。その場合、質問は明らかに意味をなしません。最もよく知られている密接に関連し、いえ、のみ64ビットであり、全く32ビットのバリアントを有していないIA64、およびx86 / AMD64ある異なる AMD64は64ビットのみであり、x86の32ビットのみである、アーキテクチャ。

実際、後者のステートメントはもう100%真実ではありません。Linuxは最近x32 ABIを追加しました。これにより、32ビットポインターでAMD64コードを実行できるため、「適切な」CPUアーキテクチャではありませんが、AMD64アーキテクチャをネイティブのように使用する方法です。 32ビットバリアント。これは正確に行われていたので、私は上記のパフォーマンスのオーバーヘッドが原因となった実際の現実世界のシステムでは、実世界のコードを実行している現実世界のユーザーのための測定、定量化の問題を。


8
x86と比較したamd64の追加のレジスタと命令はどうですか?それはパフォーマンスをどの程度改善しますか?
フィリップハグランド

2
MacOS XおよびiOSのObjective-Cで使用される「タグ付きポインター」のGoogle。非常に大量のオブジェクトにはメモリがまったく割り当てられていませんが、64ビットシステムではオブジェクト全体がポインタ内で偽装されています。(Javaは同様のことを行うと聞きました)。C ++では、64ビットのstd :: stringには、多くの場合、メモリ割り当てなしでオブジェクト自体に最大22文字が含まれています。メモリの大幅な節約と速度の改善。
gnasher729

3
ポインターと整数のサイズは?ほとんどの64ビットアーキテクチャの大きなアドレス空間と追加のレジスタはどうですか?

1
「あなたは20%〜によって命令キャッシュを[減少]ましたが、」命令セットが完全に異なっているので、議論の余地がある(そして多くの場合、より効率的な)
BlueRaja -ダニーPflughoeft

3
「これはパフォーマンスに無視できないほどの悪影響を及ぼします。」このステートメントは絶対的な意味では真実ですが、アプリケーションのパフォーマンスボトルネックの大部分はロード時間、メモリ使用量/帯域幅、またはキャッシュ内の命令数にないという事実を無視します。
イアン・ケンプ

6

ソフトウェアがレガシシステム、ドライバー、またはライブラリと直接インターフェイスする必要がある場合、OSが一般的に(間違いなくWindowsとLinuxのAFAIK)64ビットと32の混合を許可しないため、32ビットバージョンを提供する必要があります。プロセス内のビットコード。

たとえば、ソフトウェアが特殊なハードウェアにアクセスする必要がある場合、32ビットドライバーしか使用できない古いモデルを顧客が操作することは珍しくありません。


2
WindowsとLinuxの両方で、同じプロセスで32ビットと64ビットを混在させることができます:stackoverflow.com/q/12716419/703382
Navin

1
@Navin:でも実用的ですか?64ビットWindowsアプリケーション(たとえば、64ビットバージョンのWindowsで実行されているCPUとしてマークされた.NETアプリケーション)でCOMコンポーネントを使用できますか?
ピーターモーテンセン

3

お使いのソフトウェアは、DLLの場合は、しなければならない 32ビットと64ビットの両方のバージョンを提供します。お客様がDLLと通信するために32ビットまたは64ビットのソフトウェアを使用するかどうかはわかりません。また、DLLはアプリケーションと同じビット長を使用する必要があります。これは交渉不可能です。

あなたのソフトウェアがスタンドアロンの実行可能ファイルである場合、それはあまり明確ではありません。古いOSでソフトウェアを実行する必要がない場合、32ビットバージョンを提供する必要はありません。64ビットに固執し、64ビットOSが必要であることを指定すれば、作業は完了です。

古いのOS上で実行するソフトウェアが必要なのですがあれば、あなたは積極的かもしれませ 64ビットバージョンを提供したいです。2つのバージョンがある場合、テストは2倍になります。さまざまなOSバージョンと言語でソフトウェアを適切にテストするのは簡単なプロセスではありません。32ビットソフトウェアは64ビットプラットフォーム上で完璧に動作するため、特に小規模の開発者がソフトウェアを32ビットとしてのみリリースすることは依然として一般的です。

また、ほとんどのモバイルは32ビットです。現在、一部のハイエンドのものは64ビットになっているかもしれませんが、そのステップを踏む理由はほとんどありません。したがって、クロスプラットフォームを開発していて、Android上でもコードを実行したい場合は、32ビットのままにするのが安全なオプションです。


テストの削減に関するあなたの立場に反論します。代わりに、テストを増やして微妙なエラーをキャッチする簡単な方法として、特にレジスタサイズが異なるだけでなく、バ​​イトオーダーが異なる複数のプラットフォームでテストすることをお勧めします。さらに、推奨される最小ハードウェア要件を満たしていないコンピューターでもテストを行います。これにより、非常に大きなデータセットを除き、表示されない可能性のある追加の問題も明らかになります。
-hildred

@hildred無制限のテストリソースで、私は同意します。ただし、実際には、ターゲットをより詳細に制御できる場合は、このテストをすぐに行う必要はありません。VMでこれらのプラットフォームの一部をシミュレートできることは確かですが、物理的なハードウェアのセットアップが必要な場合、大量の手動(非自動化)作業が必要になります。これを明示的にテストするためのテストハーネスを作成する手間を省くことができますが、決して無料ではありません。
グラハム

1
無料ではないが、実に安い。プラットフォーム以外のテストを自動テスト(時折ばかテスト)に制限する場合、ハードウェアを使用しますセットアップとは別に、初期セットアップ後のテスト成功のコストは電力とテストパスあたり約7人分に制限されます。失敗したテストのコストはもちろん高くなりますが、通常はそれらの価値が高くなります(常にハードウェア障害が発生します)。このタイプのセットアップは、追跡するのが難しい特定のクラスのポインター問題を容易に公開するため、Cプログラマーにとって特に役立ちます。
16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.