2012-09-28 5 views
3

고려 다음과 같은 경우변수에 대한 로컬 별칭을 만드는 것이 오버 헤드를 추가합니까?

void func(const A& a) 
{ 
    //Case 1: 
    const int& val = a->b->c->d; 
    func1(val); 
    func2(val); 

    //Case 2: 
    func1(a->b->c->d); 
    func2(a->b->c->d); 

    //Case3: 
    int val = a->b->c->d; 
    func1(val); 
    func2(val); 
} 

w.r.t 가독성, Case3 괜찮은 컴파일러를 들어, 위의 모든 경우에 해당되며, 속도

w.r.t 가장 간단? 그들 중 어느 것이 가장 빠르지 않고 가장 느린가?

모든 포인터가 원시 포인터이고 힙의 개체를 가리키고 있다고 가정합니다.

업데이트 : 위의 그림과 같이 인수가 const이라고 가정하면 func1과 func2는 값 또는 const 참조로 인수를 취할 수 있습니다. 두 기능을 가정

+3

것을 분명히 볼 수 있습니다 그것은''func1'은'A'를 수정하는'A-> b' 가능,'A-> B-> c', 및/또는 경우이 세 가지 코드 조각은 실제로 비 해당 될 수 있음을 주목할 필요가 a-> b-> c-> d'. 그래서 컴파일러가 이들을 모두 동일한 코드로 최적화 할 수있는 유일한 방법은'func1'의 정의에 접근 할 수 있는지 아니면 함수 적으로 동등하다는 것을 어떻게 든 다르게 확인하는 것입니다. – ruakh

+0

@ruakh'func1'은'd' 값만 전달하면'a','b' 또는'c'를 어떻게 수정합니까? –

+0

@Dave : 아마도 'a'는 전역 변수입니다. A는 CONST를 만든 경우에도 –

답변

1

이 사례 1은 적어도 빨리 사례 코멘트에 언급 ruakh 2.

로 인으로 사례 3은 적어도 빠르고, 값하여 인수를, 일부 복잡한 흐름이있다 최적화가 발생하기 전에 분석이 필요합니다.

함수 매개 변수가 참조 인 경우 값의 최종 메모리로드가 수행되지 않을 수 있습니다. 그러면 사례 1이 가장 빠릅니다.

매크로가 함수가 아니라 매크로 인 경우 모든 베팅이 해제됩니다.

0

첫 번째 시나리오에서는 val에서 a -> b -> c -> d로 참조를 만듭니다. 따라서 컴파일러의 pov val에서 포인터가 역 참조됩니다.

wrt 속도 세 번째 것은 가장 단순합니다. 단순히 값의 복사본을 만드는 것보다 속도가 빠릅니다.

처음 두 방법의 문제는 당신이

case 1 
lea eax,[ebp+a] 
push eax 

case 2 
lea eax, [ebp+a] 
lea ebx, [eax] 
.... 

case 3 
mov eax [ebp+val] 
push eax 

을 할 필요가 있도록 포인터 값을 얻는 역 참조해야한다는 것입니다 그리고 당신은 세 번째가 가장 빠른

+0

알겠습니다. 그러나 d가 원시가 아닌 경우 case1 또는 case2가 가장 빠릅니까? – balki

+0

사례 1은 사례 2보다 빠릅니다. –

관련 문제