2016-10-06 2 views
1

을 다시 사용하는 경우 나는 다음과 같은 코드를 가지고 :는 최적화를 컴파일러 및 예를 들어 변수

int main(){ 
    myClass a(...); 
    a.doSomething(); 
    if(...){ 
    myClass c(...); 
    c.doSomething(); 
    } 
} 

윌 GCC 또는 그 소리와 같은 일반적인 컴파일러은 "은"시 더 이상 사용되지 않습니다 찾는하여 이러한 변수의 사용을 최적화 평생 동안 "c"를위한 공간을 재 할당하는 대신에? 그 클래스에 대해 작동하지 않는 경우 double 또는 size_t 같은 "전통적인"형식으로 작동합니까?

자주 호출되는 함수의 할당 비용을 최소화하려고합니다. 그러나 함수 내부의 일부 오래된 변수는 이미 쓸모가 없지만 새로운 변수는 그 이름이라고해서는 안됩니다. 직접 나를 위해 변수를 재사용 컴파일러 것인가 아니면

myClass a(...); 
something(a); 
if(...){ 
    #define c a 
    c=myClass(...); 
    something c; 
    #undef c 
} 
+3

프로파일 러에서 이것이 응용 프로그램의 핫스팟임을 알리고 생성 된 어셈블리는 무엇을 말합니까? – GManNickG

+3

어때 대략 :'{myClass a; a.doSomething(); } {if (...) {myClass c; c.doSomething(); }}' –

+0

함수 본문에 짧은 범위가있는 경우에도 GCC는 스택 공간을 아주 잘 재사용하지 않았습니다. 그러나 나는 그것이 더 나아 졌다고 믿는다. –

답변

0

이러한 변수는 스택에 할당 같은 것을해야한다. 컴파일러가 공간을 재사용하지 않더라도 추가 CPU 명령어, RAM만으로 이어지지는 않습니다. 스택에 할당은 스택 포인터에 할당 된 바이트 수를 추가하는 것입니다. 그리고 일반적으로 함수에 존재하는 모든 변수의 크기를 추가하여 하나의 명령으로 완료됩니다. 그리고 어떤 경우 든 컴파일러는 변수가 할당 된 CPU 레지스터를 재사용 할만큼 똑똑 할 것입니다.

클래스에 소멸자가있는 경우 블록 끝까지 유지해야합니다. 따라서 변수 a의 메모리는 함수의 끝에 필요하기 때문에 다시 사용되지 않습니다. 그러나 컴파일러는 여전히 사용되는 레지스터를 재사용 할 수 있습니다.

+1

스택에 있어야합니까? 그것들은 단지 "자동"변수입니다. 스택 사용은 구현에 따라 다릅니다. –

+0

글쎄, 그들은 최적화 된 수 있으며 레지스터에 배치됩니다. 이 경우 할당 비용이 들지 않고 레지스터 재사용은 컴파일러가 충분히 잘 수행해야합니다. –

5

일반적으로 컴파일러는 범위 끝까지 a을 다시 사용할 수 없습니다. 함수 끝에는 닫는 중괄호 }이 있습니다. 이 기능 (예측 가능한 시점에 객체를 파괴)은 소멸자가 특수 코드 *을 실행할 때 C++로 가드를 만들 수 있습니다.

자주 호출되는 함수의 할당 비용을 최소화하려고합니다.

자동 변수를 할당하는 데 비용이 거의 들지 않으므로 대다수의 비용은 생성자를 호출하는 데 있습니다. 이것은 당신이 최적화 할 수있는 것이 아닙니다.

* 개체에 사소한 소멸자가있는 경우 컴파일러에서 메모리를 다시 사용할 수 있습니다. 이렇게하면 시간이 아닌 메모리가 절약됩니다.

+0

모든 개체에는 소멸자가 있습니다. – xaxxon