2013-04-02 1 views
0

현재 코드를 검토 중이며 다양한 크기의 로컬 변수가 많습니다.로컬 변수의 순서 : cpp에서 변수를 선언하는 가장 좋은 방법

크기가 큰 순서대로 선언하거나 그 반대의 순서로 선언하고 있습니다.

두 시나리오 중 하나에서 메모리 레이아웃을 사용하여 설명하십시오.

선언 순서 또는 크기에 따라 로컬 변수에 메모리가 할당됩니까?

int fun() 
{ 

    struct *ptr; 
    int var1; 
    long double *ld; 
    . 
    . 
    . 
    . 
} 
+0

무엇이 당신의 질문입니까? 예를 들어 코드가 있습니까? –

+4

대개는 중요하지 않습니다. –

+0

"정렬"에 관해 읽을 시간. – sharptooth

답변

3

C++에서 지역 변수를 선언하고 초기화하는 가장 좋은 장소는 처음 필요한 부분입니다.

귀하가 반대되는 구체적인 증거가없는 한, 변수의 크기는 전혀 고려하지 않아야합니다.

1

컴파일러는 로컬 변수를 최적화 할 때 로컬 변수의 순서를 재정렬합니다. 즉, 같은 범위에있는 변수의 순서는 중요하지 않습니다.

void func() { 
    //int i, j; // not here! 
    for (int i = 0 ; i<10; ++i) { 
     int j = func2(i); 
     ... 
    } 
    // i and j below are different variables than i and j above 
    // you can consider changing their names if they also have different meaning 
    for (int i = 0 ; i<10; ++i) { 
     int j = func3(i); 
     ... 
    } 
} 

비록 가능성이 성능이나 메모리 풋 프린트 점에서 중요하지 않습니다 좋은 최적화 컴파일러에 대해 : 좋은 생각,하지만 무엇

는 예를 들어, 사용되는 범위에 지역 변수를 선언하는 것입니다 보기 (변수가 어쨌든 사용되는 경우이를 감지합니다). 그것은 여전히 ​​코드를 더 읽기 좋게 만들 것이고, 서로 다른 범위에서 무관 한 값을 섞어 버리는 것을 피할 것이다. 그래서 컴파일러 경고에 잡히지 않는 어리석은 버그를 막을 것이다. 왜냐하면 컴파일러는 실수로 재사용 변수의 초기화를 잊어 버렸을 때, 새로운 변수를 초기화하는 것을 잊어 버리면 알 수 있습니다).


또한, 중요한 것은 변수 (또는 무엇이든)에 대한 걱정 : GCC에 대한 -Wall -Wextra 같은 컴파일러 경고를 켜해야합니다. 또한 valgrind을 사용하는 것이 좋습니다 (valgrind가있는 OS에서 코드를 실행할 수있는 경우).

0

내 접근 방식은 가능한 한 가장 작은 범위에서 지역 변수를 범위의 시작 부분에 선언하는 것입니다.

void foo() 
{ 
    int local1 = 42; 
    int local2 = bar(local1); 

    if (local2 != local1) 
    { 
     double local3 = double(local2)/double(local1); 
     MyMemoryAllocatingObject mmao; // large memory allocation, deallocation in destructor 

     baz(local3); 
     bat(mmao); 
    } // mmao memory gets freed here 
} 

정교하지 않은 컴파일러의 경우 최적화를 돕기 때문에 사용자가 정보를 추적하는 데 도움이됩니다. 또한 지역 주민이 범위를 벗어나므로 소멸자가 호출되므로 메모리 사용 공간을 최대한 작게 유지할 수 있습니다.

관련 문제