32 ビット アーキテクチャと 64 ビット アーキテクチャの両方に移植可能なコードを記述するために考慮すべき点
-
20-09-2019 - |
質問
32 ビット マシンと 64 ビット マシンの両方で移植可能なコードを作成する際に留意すべき点は何ですか?
これについてさらに考えてみると、直面した問題に関するあなたの経験を追加していただければ役立つと思います。
さらにこれに加えて、ポインタを返す関数のプロトタイプが見つからないという問題に直面したことがあります。同じものを 64 ビット マシンに移植したところ、コードがクラッシュし、しばらくその理由がわかりませんでしたが、後で、欠落しているプロトタイプはすべて int を返すと想定されていることが問題の原因であることに気づきました。
このような例はどれも役に立ちます。
編集:コミュニティ Wiki に追加します。
解決
注意点:
- 整数型へのポインタのキャストは危険です
- データ構造のサイズは変更される可能性があります
- サインエクステンションに注意してください
- ABIが違う?
私が役に立ったと感じたいくつかのヒントとテクニック:
- ネイティブ サイズの整数型を (ヘッダーまたは
typedef
自分のもの)、サイズを気にしない変数がある場合に使用します。 - 可能な限り明示的な変数タイプを使用してください (u_int64_t、int_32_t など)。
他のヒント
- 一部の一体型タイプはサイズが異なる場合があります
- ポインタの長さが異なる
- 構造体のパディング
- 位置合わせ
Windows では、通常の x32 マシンには複数の呼び出し規則があるのに対し、x64 には呼び出し規則しかありません。
32 ビットのコンポーネントと 64 ビットのコンポーネントがある場合、事態はさらに不透明になります。Windows では、結局、COM サービスを作成して会話をさせることになりました。
スタックポインタを押す2倍の領域を占有します。スタックサイズは、64ビットでコンパイルして実行変わらないとき、不思議な失敗する32ビットで細かい実行されるコードを引き起こし、しかしOSのバージョン間で変更することはできません。私はこれを知っているか私に聞かないでください。
はsizeof(int型)かもしれない!=はsizeof(void *型)
アラインメント。アライメントのニーズが変更される場合がありますことを、その可能性。これは、あなたが整列されているはずですが、唯一の32ビット(またはケアをdoesntのプロセッサ上)での事故によって整列させたもの。
が虐待されたバグを公開することができますは、受信機がポインタを期待している場合可変引数に0を渡すいけません。これは精通した開発者は、0が有効なNULLポインタであることを知っているC ++で痛いです。あなたはおそらくOKですので、C devのは、通常、NULLを使用します。
自動テストを書くと、両方のプラットフォーム上で定期的に実行します。