-3

Visual C++、デバッグ モード。

if(k>=0)

011D14CE  cmp         dword ptr [k],0  
011D14D2  jl          bez+28h (11D14D8h)  

return true;

011D14D4  mov         al,1  
011D14D6  jmp         bez+33h (11D14E3h)  

return false;
011D14D8  xor         al,al  
011D14DA  jmp         bez+33h (11D14E3h)  

そして等しいコード:

return (k>=0)?(true):(false);
011D14DC  cmp         dword ptr [k],0  
011D14E0  setge       al  

何が速いですか?関数呼び出しで 2 番目の構造を使用すると、どちらが高速になりますか?

if(i>0)
    Foo(true);
else
    Foo(false);

または:

Foo((i>0)?(true):(false))

?

4

2 に答える 2

10

デバッグ モードでコンパイルすると、そのコードは等しくありません。最初のバージョンでは、return trueブランチにブレークポイントを設定できます。これは では実行できませんsetge al

于 2012-06-30T17:45:19.560 に答える
1

見ているコードの出力は、デバッグ スイッチ設定でビルドされています。

コンパイラはソースの各行に対してコードを作成するため、デバッグとソース追跡が多かれ少なかれ行われます。

1 つのインスタンスには 4 行のコードがあります。1 つのインスタンスには 1 行のコードがあります。コンパイラはそれに応じてコードを出力します。

ただし、デバッグ コードを使用して本番環境に移行することはありません。最適化を使用してコードを作成します。

最適化を使用して両方のインスタンスをコンパイルすると、まったく同じコードが表示されます。

于 2012-06-30T17:54:15.553 に答える