1

何かを最適化する方法や関数の呼び出しをコンパイラーにどのように伝えることができますか。mallocつまり、割り当てメソッドを作成し、コンパイラーがorで最適化するように最適化しnewます。

または、コードのどこかで関数 X が呼び出され、その戻り値が使用されていない場合は、この呼び出しを削除します。(コンパイラがそれについて何も知らない.libの関数)

これにはオプションがありますか?

例えば:

auto val=X(); //Use the return value
X(); //Don't use
auto t=allocate<T>(); //Allocate on heap
t->Show(val); //Run single function and don't use it's pointer somewhere (Save it after the function is exit)

そして、次のように最適化します。

X(); //First line, just call it
T().Show(val); //Combines third and fourth lines, Allocate on stack and run the single function

「なぜこれが必要なのですか?」と尋ねる場合 独自の GC とヒープを使用してプログラミング言語を作成しています。(それもいろいろ)

それは C++ に変換されるので、変換中にコードを最適化したくありません。(面倒くさい) ところどころランダムに関数を呼べるから。(それらの値が使用されているかどうかはわかりません)

4

1 に答える 1

5

最適化はコンパイラ固有であるため、コンパイラのドキュメントを調べて、コードに挿入できる最適化の「ヒント」を確認する必要があります。たとえば、GCC の関数属性の一部を次に示します。

  • このmalloc属性は、関数が null 以外のポインターを返す場合、それは常に "新しい" メモリ領域であり、既に割り当てられているものへの別のポインターではないことをコンパイラーに伝えます。おそらく、実数をラップする関数でこれを使用したいと思うでしょうmalloc()
  • const属性 (通常のキーワードconstとは異なります) は、関数の戻り値がその引数のみに依存し、副作用がないことを示しているため、コンパイラが同じ引数で重複した呼び出しを排除しても安全です。
  • このnoreturn属性は、関数が決して返らないことをコンパイラに伝えます。C など、プログラムを終了する関数でこれを使用しますexit()

属性は、通常はヘッダー ファイル内の関数の宣言に追加されるため、後でリンクされるコンパイル済みライブラリ内に関数の実装がある場合でも使用できます。ただし、関数属性はコンパイラに対する約束であることを忘れないでください。たとえば、属性を使用して関数を宣言し、noreturn実際に返すことができるコードでそれを実装すると、実行時に奇妙なことが起こる可能性があります。


関数属性を使用して、正確性チェックを支援することもできます。

  • このnonnull属性は、特定の (ポインター) 引数が null であってはならないことをコンパイラーに伝えるため、null である可能性があることが検出された場合に警告を発行できます。
  • format引数は、関数が C のような書式文字列を取ることをコンパイラに伝えるためprintf()、可変引数の型が書式文字列の対応する書式コードと一致することを確認できます。(たとえば%s、書式文字列に " " を記述してはならず、その値として整数を渡す必要があります。)
于 2012-11-11T18:48:09.347 に答える