c - 定义的值比硬编码的数字慢

时间:2017-09-19 06:15:56

标签: c performance optimization macros

这个问题对你来说可能显得愚蠢,但我无法找到答案,我想确保它按照我的想法运作。

最近我遇到了这段代码:

//SwipeGestureMethodUsing
func SwipeGestureMethodUsing ()
{
    //AddSwipeGesture
    [UISwipeGestureRecognizerDirection.right,
     UISwipeGestureRecognizerDirection.left,
     UISwipeGestureRecognizerDirection.up,
     UISwipeGestureRecognizerDirection.down].forEach({ direction in
        let swipe = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture))
        swipe.direction = direction
        window?.addGestureRecognizer(swipe)
     })
}

//respondToSwipeGesture
func respondToSwipeGesture(gesture: UIGestureRecognizer) {

    if let swipeGesture = gesture as? UISwipeGestureRecognizer
    {
        switch swipeGesture.direction
        {
        case UISwipeGestureRecognizerDirection.right:
            print("Swiped right")
        case UISwipeGestureRecognizerDirection.down:
            print("Swiped down")
        case UISwipeGestureRecognizerDirection.left:
            print("Swiped left")
        case UISwipeGestureRecognizerDirection.up:
            print("Swiped up")
        default:
            break
        }
    }
}

据我所知,出于优化原因,0.0039215689f(指的是1/255)是硬编码的。 现在想象一下我想要定义它 出于可读性原因(即使这里选择的名称不是更好,它仅仅是为了示例)。

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);
    }
}

这会导致代码执行速度变慢吗?

3 个答案:

答案 0 :(得分:6)

  

这会导致代码执行速度变慢吗?

不,因为这两个代码片段完全相同,因为在编译翻译单元之前会扩展MACROS。

答案 1 :(得分:2)

宏执行文本替换。编译的代码与在代码中复制并粘贴宏的替换文本完全相同。

答案 2 :(得分:1)

我相信它们根本没有任何区别。

文本替换模式。因此,在编译代码之前,它会被替换为

您可以尝试预处理这两个文件,并查看终端中的差异:

gcc -E 1.c -o 1.i
gcc -E 2.c -o 2.i
diff -u 1.i 2.i