2016-06-30 4 views
1

대부분의 경우 함수를 만들 때 코드를 디버그하기 쉽기 때문에 많은 변수를 만듭니다. (28 바이트는 점을 고려컴파일러 최적화 - 가변 메모리 사용량

void foo(int value) { 
    int x = value * 1; 
    int y = value * 2; 
    int z = value * 3; 

    int u = x + 1; 
    int v = y + 2; 
    int w = z + 3; 
} 

이 코드는하지만 메모리를 많이 사용 (당신이 무슨 일이 일어나고 있는지 단계별로 볼 수 있습니다) 괜찮 및 디버그에 쉬운 :

내가이 함수가 있다고 가정하자

    :이를 바탕으로

    void foo(int value) { 
        int u = value * 1 + 1; 
        int v = value * 2 + 2; 
        int w = value * 3 + 3; 
    } 
    

    나는 몇 가지 질문이있다 : 각 int)은 4 바이트이며,이 방법으로 최적화 할 수

  1. 컴파일러는 릴리스 빌드에서 이런 종류의 최적화를 수행합니까?
  2. 더 많은 레지스터를 사용하지 않도록 함수에서 더 이상 사용되지 않는 변수의 메모리를 다시 사용합니까?
+1

실제 사례가 더 좋을 수도 있습니다. 이 기능들은 non-ops이며 완벽하게 최적화 될 수 있습니다. 생성 된 어셈블을 항상 검사하여 컴파일러가 코드를 컴파일 한 후 실제로 수행하는지 확인하지는 마십시오. – NathanOliver

+1

함수가 리턴하자마자 28 바이트가 다음 함수 호출을 위해 해제됩니다. 그것들은 단지 스택에 임시 저장되어 있습니다 ("할당"하기에 꽤 싸기도합니다). – Steve

+1

함수의 실행은 해당 함수의 존재 여부에 의존하지 않으므로 대부분 존재하지 않습니다. 또한, 레지스터 할당도 중요합니다. 대부분의 지역 변수는 메모리에 없습니다. – harold

답변

3

예. 최신 컴파일러는 중간 변수를 제거합니다. 예. 최신 컴파일러는 상수를 접어두고 레지스터와 메모리 위치를 재사용합니다.

요약하면; 이 수준에서 물건에 대해 걱정하지 마시고, 컴파일러가 고칠 것입니다. 대신에 읽을 수있는 코드와 알고리즘 개선을 작성하는 것에 대해 걱정하고 컴파일러에 세부 사항을 남겨 둡니다. 요즘은 꽤 똑똑합니다.)