2017-09-19 5 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

컴파일러는이 모든 것을 처리하고, 번역 작업 중 하나를 가능한 한 읽기 쉽고 유지 보수 할 수있게 만들고 컴파일러가 어셈블러 생성을 염려하게 만듭니다. – SPlatten

+0

* 0.0039215689f (1/255 참조)는 최적화를 위해 하드 코딩됨을 이해합니다. * 좋은 컴파일러는 컴파일 타임에 '1/255'를 자동으로 '0.0039215689f'로 변환합니다. – tilz0R

답변

6

이렇게하면 코드 실행 속도가 느려 집니까?

아니요. 번역 단위가 컴파일되기 전에 MACROS가 확장되므로이 두 코드 스 니펫이 동일하므로 아니오입니다.

2

매크로는 텍스트를 대체합니다. 컴파일 된 코드는 코드에서 매크로의 대체 텍스트를 복사하여 붙여 넣은 경우와 완전히 동일합니다.

1

나는 그들이 전혀 차이가 없다고 생각합니다.

매크로는 텍스트 대체 패턴입니다. 따라서 코드가 컴파일되기 전에 으로 바뀝니다.

당신은 두 파일을 전처리 시도하고 터미널에서 차이를 볼 수 있습니다 : 그것은 동일

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