9

__assumeのドキュメントには、「次の例に示すように、__ assumeの最も一般的な使用法は、switchステートメントのデフォルトの場合です。」と記載されています。

  • __assumeがより効率的な(または別の)コードにつながる可能性がある他のケースはありますか?
  • if / elseの内部にある場合、コンパイラはif条件のためにすでにわかっていることを自動的に「想定」していますか?

上記のいずれかを示す重要な例を見つけることができませんでした-他の誰かが見つけられることを願っています。

4

1 に答える 1

10

/Oxスイッチでコンパイルされた次のコードについて考えてみます。

if (1) {
  printf("live code\n");
} else {
  printf("dead code\n");
}

オプティマイザーはを最適化しelseます。今考えてみましょう:

int x = 1;
if (x == 1) {
  printf("live code\n");
} else {
  printf("dead code\n");
}

オプティマイザーは再び最適化しelseます。また、考慮してください:

int x = 1;
__assume(x != 1);
if (x == 1) {
  printf("live code\n");
} else {
  printf("dead code\n");
}

オプティマイザーは今回最適化しますif-間違ってそうです。

/Oxテストするには、リリースモード(およびオプションを使用)でテストプログラムをビルド/Ziし、生成されたアセンブリ(Alt+8Visual Studioで)を確認します。

if/elseここで、インライン方式でテストされている上記の条件について考えてみます。特定のコンテキストでは、プログラマーはインラインメソッドが特定の値で呼び出され、オプティマイザーがこの事実を認識していない可能性があることを知っている場合があります。__assumeインラインメソッドが呼び出される直前に、上記の方法で呼び出し元レベルで使用すると、理論的にはオプティマイザーに役立ちます。

最適化のベストプラクティスから:

__assumeは複数のリリースでVisualC++に含まれていましたが、Visual C ++ 2005でははるかに使いやすくなっています。__assumeを使用すると、開発者はコンパイラーに変数の値について仮定するように指示できます。

たとえば、__assume(a <5); オプティマイザーに、そのコード行で変数aが5未満であることを通知します。これもコンパイラーへの約束です。プログラムのこの時点でaが実際に6である場合、コンパイラーが最適化した後のプログラムの動作は、期待したものとは異なる場合があります。__assumeは、switchステートメントや条件式の前に最も役立ちます。

__assumeにはいくつかの制限があります。まず、__ restrictと同様に、これは単なる提案であるため、コンパイラーはそれを自由に無視できます。また、__ assumは現在、定数に対する変数の不等式でのみ機能します。たとえば、assume(a <b)のように、シンボリックな不等式は伝播しません。

于 2010-08-09T15:36:00.257 に答える