2016-09-23 3 views
2

このようなCまたはC++のコードがある場合:関数が任意の副作用を持っているかどうかを確認することができない場合可能な副作用を伴ってコンパイラが最適化機能を呼び出すことができますか?

if (func()) 
    ; 

func()を関数の呼び出しを最適化コンパイラができますか?原産地私の質問の

:私は時々このような方法でマクロを主張呼び出す:

if (func()) 
    assert(0); 

私はfunc()常にをが呼び出されることを確認すると、そのasssertionをデバッグモードで失敗した場合func()戻り場合間違った値。しかし、最近私のコードは、関数が常に呼び出されることを保証していないと警告されました。

+2

'func'の定義を投稿できますか? –

+1

なぜ 'assert(!func())'または ' retval = func(); assert(!retval); '? – cxw

+0

これは副作用を伴うことがある一般的な機能です。私はこれを特定の機能について議論したくありません。関数が同じファイルに実装されていないと仮定しましょう。コンパイラはその内部に何か情報を持っていません。 – faramir

答えて

3

(これはCである1つのプログラミング言語だけ、ない2について質問を投稿してください。答え++。

いいえ、副作用を有することができる機能があるため、アウト最適化することができません副作用を「最適化」することができます。そして、「副作用」とは「あなたのプログラムが行うこと」を意味するので、そのようなことを許可されたコンパイラは特に有用ではありません。そのため、標準の「そのまま」のルールが、あなたが話している最適化の種類を妨げる理由です。

10

funcへの呼び出しを最適化することでプログラムの観察可能な動作が変更されないことがコンパイラによって証明できない場合、最適化を行うことはできません。

コンパイラが、関数を呼び出すときに観測可能な効果がないと証明できない限り、呼び出しが行われます。コンパイラは時々スマートになる可能性があるので、確かめたい場合は、実際にの関数がに機能していることを確認してください。 (それ以外の場合は、気にする必要はありません)

これはas-if ruleとして知られています。

関連する問題