2017-02-04 8 views
-2

이 시나리오 고려 : ~ 40시에 유사한 실행을 프로파일 링하는 동안getter를 사용하여 지역 변수의 즉각적인 대체?

class Test { 
public: 
    Test() : _var{5} {} 
    inline int getVar() { 
     return _var; 
    } 
private: 
    int _var; 
} 

void func(Test& t) { 
    int var = t.getVar(); 
    int a = 1 + var; 
    int b = 2 + var; 
    ... 
    int z = 26 + var; 
} 

int main() { 
    Test t; 
    for (int i = 0; i < 1000000; ++i) { 
     func(t); 
    } 
} 

을, 나는 getVar()가 바로 int를 액세스하기위한 큰 것 같다 0.8S, 주위에 나 혼자 전화 비용 것을 보았다.

그러나 로컬 변수와 Test의 getter를 사용하는 대신 my _var를 public으로 설정하고 직접 액세스하여 (t._var) 더 느립니다.

거의 즉시 "_var"에 액세스 할 수있는 마법 C++ 솔루션이 있습니까?

+6

간단한 마술은 컴파일러에게 최적화를 요청하는 것입니다. –

+2

어떻게 측정 했습니까? 그렇다면 어떤 컴파일러 최적화 수준이 사용 되었습니까? –

+0

로컬 변수의 값을 캐싱하는 것은 컴파일러가 매회 메모리에서 값을 가져 오는 대신 레지스터에 값을 저장하도록하므로 최대한 빠릅니다. – molbdnilo

답변

-1

클래스 정의 내에 정의 된 메서드는 항상 인라인입니다. 인라인은 해당 메서드에 대한 호출이 메서드 본문으로 바뀌 었음을 의미하는 것은 아니며 look이라는 의미입니다.

시간 측정이 잘못되었거나 최적화를 사용하지 않았으며 컴파일러가 최적화되지 않았을 가능성이 큽니다.

+0

그들이 항상 줄 지어있는 것은 사실이 아닙니다. 인라인은 힌트입니다. 컴파일러는 그것을 무시할 수 있습니다. –

+1

_inline_는 함수의 정의가 "프로그램 내에 두 번 이상 나타날 수 있습니다"라는 것을 의미합니다. 그것은 함수의 몸을 초기화하는 원래의 의도를 잃어 버렸습니다. –