次のようにコンパイルすると、まったく同じバイナリ結果が得られるかどうかを知りたいです。
- 同じソースコード
- 同じコンパイラ、バージョン、コマンド
- 同じ図書館
または、次のようなさまざまなバイナリにつながる可能性のある他の制約もありますか?
- ソースがコンパイルされた時刻
- システム、カーネル バージョン
- その他のビルドツール
ありがとうございました!
次のようにコンパイルすると、まったく同じバイナリ結果が得られるかどうかを知りたいです。
または、次のようなさまざまなバイナリにつながる可能性のある他の制約もありますか?
ありがとうございました!
コード、ライブラリ、およびコンパイラを修正するだけで、同じ出力が得られるという保証はありません。ご指摘のとおり、コンパイラが実行される環境が影響を与える可能性があります。
これらの機能をすべて見つけて制御できたとしても、コンパイルは確定的ではない場合があります。GCC 3.3 ドキュメントの具体的な例を次に示します(最近のバージョンでは文言が変更されていることに注意してください)。
-fno-guess-branch-probability
ランダム化されたモデルを使用して分岐確率を推測しないでください。プロファイリング フィードバック (-fprofile-arcs) または __builtin_expect のいずれからも利用できない場合、gcc はランダム化されたモデルを使用して分岐確率を推測することを選択することがあります。これは、同じプログラムでコンパイラを実行すると、異なるオブジェクト コードが生成される可能性があることを意味します。
ハード リアルタイム システムでは、コンパイラの実行ごとに動作が異なるコードが生成されることは望ましくありません。非決定性を最小限に抑えることが最も重要です。このスイッチにより、ユーザーは非決定性を減らすことができますが、最適化が劣る可能性があります。