2017-09-19 19 views
2

この質問はあなたには間違っているかもしれませんが、私は答えを見つけることができませんでした。c - 定義された値がハードコードされた数値よりも遅い

最近、私は、このコードに出くわした:

void RDP_G_SETBLENDCOLOR(void) 
{ 
    Gfx.BlendColor.R = _SHIFTR(w1, 24, 8) * 0.0039215689f; 
    Gfx.BlendColor.G = _SHIFTR(w1, 16, 8) * 0.0039215689f; 
    Gfx.BlendColor.B = _SHIFTR(w1, 8, 8) * 0.0039215689f; 
    Gfx.BlendColor.A = _SHIFTR(w1, 0, 8) * 0.0039215689f; 

    if(OpenGL.Ext_FragmentProgram && (System.Options & BRDP_COMBINER)) { 
     glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 2, Gfx.BlendColor.R, Gfx.BlendColor.G, Gfx.BlendColor.B, Gfx.BlendColor.A); 
    } 
} 

私は(1/255を参照)0.0039215689fは、最適化の理由のためにハードコードされていることを理解しています。 ここでは、読みやすくするために を定義したいと考えています(ここで選択した名前がそれほど良くない場合でも、例のためです)。

#define PIXEL_VALUE 0.0039215689f 

void RDP_G_SETBLENDCOLOR(void) 
{ 
    Gfx.BlendColor.R = _SHIFTR(w1, 24, 8) * PIXEL_VALUE; 
    Gfx.BlendColor.G = _SHIFTR(w1, 16, 8) * PIXEL_VALUE; 
    Gfx.BlendColor.B = _SHIFTR(w1, 8, 8) * PIXEL_VALUE; 
    Gfx.BlendColor.A = _SHIFTR(w1, 0, 8) * PIXEL_VALUE; 

    if(OpenGL.Ext_FragmentProgram && (System.Options & BRDP_COMBINER)) { 
     glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 2, Gfx.BlendColor.R, Gfx.BlendColor.G, Gfx.BlendColor.B, Gfx.BlendColor.A); 
    } 
} 

このように定義すると、コード実行が遅くなるのですか?

+2

翻訳単位がコンパイルされる前に、macrosesが展開されています。 – zerkms

+1

コンパイラはこれをすべて処理し、翻訳の1つを可能な限り読みやすくメンテナンス可能にし、コンパイラがアセンブラの生成を心配するようにします。 – SPlatten

+0

* 0.0039215689f(1/255を参照)は最適化のためにハードコードされていることを理解しています*良いコンパイラは自動的にコンパイル時に '1/255'を' 0.0039215689f'に自動的に変換します。 – tilz0R

答えて

6

このように定義すると、コード実行が遅くなるのですか?

いいえ、これら2つのコードスニペットは同じです。つまり、翻訳単位がコンパイルされる前にMACROSが展開されているためです。

2

マクロはテキスト置換を行います。コンパイルされるコードは、コード内のマクロの置換テキストをコピーして貼り付けた場合とまったく同じです。

1

私は彼らがまったく違いがないと信じています。

マクロは、のテキスト置換パターンです。したがって、のコードがコンパイルされる前に、置き換えられるのはです。

あなたは両方のファイルを前処理しようとすると、端末の違いを見ることができます:それは同じです

gcc -E 1.c -o 1.i 
gcc -E 2.c -o 2.i 
diff -u 1.i 2.i 
関連する問題