コンパイラ最適化の問題に対処する方法
-
10-07-2019 - |
質問
iPhoneアプリに問題があります。最適化レベルを「なし」以外に設定すると、計算エラーが発生します。これは、iPhone SDK用にビルドする場合にのみ発生します(iPhone Simulatorは常に問題ありません)。
リリースモードで最適化を無効にしても構いませんが、それを行うとアプリケーションが少し遅すぎます。
アプリケーションは複雑なため、積極的に最適化されている部分を見つけるのは困難です。
問題はGCC側にあると思います。ARMアーキテクチャ向けのコードの最適化に問題があるようだからです。
コードの特定の部分に対してのみ最適化を無効にする方法はありますか?そのような問題にどのように対処しますか?
解決
はい、それは完全に可能です。 GCCには属性があります:
/* disable optimization for this function */
void my_function(void) __attribute__((optimize(0)));
void my_function(void) {
/* ... */
}
その関数の最適化レベルを -O0
に設定します。特定の最適化を有効/無効にできます:
/* disable optimization for this function */
void my_function(void) __attribute__((optimize("no-inline-functions")));
void my_function(void) {
/* ... */
}
他のヒント
最適化がプログラムの動作を変更する場合、未定義または実装定義の動作に無意識に依存している可能性があります。変数の値と評価の順序に関する仮定に目を向けて、コードを詳しく調べる価値があるかもしれません。
関数から値を適切に返す
ことを確認してください。私の経験では、以下は時々しか機能しません。
int myFunc()
{
x+7;
}
returnキーワードの意図的で安全でない省略に注意してください
式の計算で使用されるレジスタが戻りレジスタと同じであるため。
最適化がオンになっている場合、レジスタ使用の変更が行われ、関数は必要な処理を実行できません。
コンパイラの警告を確認してください。
所属していません StackOverflow