32 ビットと 64 ビットの両方に互換性のあるコードを記述するにはどうすればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/32533

質問

コードを 32 ビットと 64 ビットの両方のプラットフォームで正しく実行したい場合は、どのような考慮事項を行う必要がありますか?

編集:どのような部分に注意する必要がありますか。文字列/文字を出力するのか、それとも構造体を使用するのか?

役に立ちましたか?

解決

オプション:

何らかの言語でコーディングしてください 仮想マシン (Javaなど)

.NET でコーディングし、特定のアーキテクチャをターゲットにしません。の .NET JIT コンパイラ 実行する前に、適切なアーキテクチャにコンパイルします。

他のヒント

解決策の 1 つは、両方のプラットフォーム (ここでは Java または .Net を考えています) で実行される仮想環境をターゲットにすることです。

または、通訳言語を選択します。

既存のコードやライブラリの呼び出しなど、他の要件はありますか?

移植性の高いコードを確実に書くためにずっとやるべきだったのと同じこと :)

モジラのガイドライン そしてその よくある質問 良い出発点です

まだ話していると思いますが、 コンパイル 個々のプラットフォームごとに個別に設定するのでしょうか?32 ビット バイナリを作成するだけで、両方で実行できます。

最も大きな問題は、32 ビットの記憶域にポインターを置かないようにすることです。

しかし、実際には、この質問に対する適切な「言語に依存しない」答えはありません。標準の「C」や「C++」のようなものに限定していても、特に確固たる答えを得ることができません。データ ストレージやポインタなどのサイズはすべて実装に大きく依存します。

正直なところ、これは言語によって異なります。C# や Java などのマネージ言語、または JavaScript、Python、PHP などのスクリプト言語は現在の方法論に固定されており、使い始めたり、高度なこと以上のことを実行したりする場合は、あまり心配する必要はありません。 。

しかし、私の推測では、C++、C、その他の低レベル言語のような言語について質問しているのではないかと思います。

最も心配しなければならないのはサイズです。32 ビットの世界では 2^32 の累乗に制限されていますが、64 ビットの世界では 2^64 まで大きくなります。

64 ビットでは、RAM 内のメモリとストレージ用のスペースが大きくなり、より大きな数値を計算できます。ただし、32 と 64 の両方でコンパイルしていることがわかっている場合は、システムに対する期待を 32 ビットの世界とバッファーと数値の制限に限定する必要があります。

C (およびおそらく C++) では、malloc のバッファー サイズを計算するときに常に sizeof 演算子を使用することを忘れないでください。この方法では、とにかくより移植性の高いコードを作成でき、64 ビット データ型が自動的に考慮されます。

ほとんどの場合、必要なのは、両方のプラットフォーム用にコードをコンパイルすることだけです。(これはコンパイル済み言語を使用していることを前提としています。そうでない場合は、おそらく何も心配する必要はありません。)

問題を引き起こす可能性があると考えられる唯一のことは、データ型のサイズを想定することですが、これはおそらくいずれにしても行うべきではないことです。そしてもちろん、アセンブリで書かれたものはすべて問題を引き起こします。

(いくつかの理論によると) "int" がシステム内で最も高速な数値操作である必要があるため、多くのコンパイラは基礎となるアーキテクチャに基づいて整数のサイズを選択することに注意してください。

これが、非常に多くのプログラマーが最も移植性の高いプログラムに typedef を使用する理由です。コードを 8 ビット プロセッサから 64 ビット プロセッサまでのあらゆるプロセッサで動作させたい場合は、C ではとにかく int が厳密に定義されていないことを認識する必要があります。

ポインターも注意が必要な領域です。ポインターの数値をいじる場合は、long、long、long、または特定の型を使用しないでください。適切な構造を使用してください。残念ながら、コンパイラによって異なります (これが、使用するコンパイラごとに個別の typedef.h ファイルが存在する理由です)。

-アダム・デイビス

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top