2017-11-29 13 views
0

,변수를 반복 정의하면 메모리가 계속 증가합니까? 내가 루프가있는 경우 예를 들어

for(int i = 0; i < N; i++) { 
    int a, b, c, d, e; 
    cin >> a >> b >> c >> d >> e; 
    foo(a, b, c, d, e); 
} 

또는

int a, b, c, d, e; 
for(int i = 0; i < N; i++) { 
    cin >> a >> b >> c >> d >> e; 
    foo(a, b, c, d, e); 
} 

하나를 더 빠르게 처리 될 수있는? 첫 번째 경우에는 for 루프 내부에 5 개의 변수를 정의하고 두 번째 변수는 외부에 정의합니다.

Difference between declaring variables before or in loop?과 같이 "어느 쪽이 빠르다"에 관한 글을 보았지만 어느 쪽이 적은 메모리를 사용하는지 모르겠습니다.

나는 프로그램의 복잡성보다는 메모리 사용량에 신경 쓰고있다.

분명히이 경우 분명히 중요하지 않지만 다차원 for-loop가 있고 수백만 번 변수를 정의해야합니다. 또는 여러 요소가 포함 된 큰 벡터를 여러 번 정의한다면 어떻게 될까요?

이 질문이 정말 간단하다면 사과드립니다. C++을 처음 접했을 때입니다. 어떤 도움이라도 대단히 감사하겠습니다. 고마워.

+1

위의 코드를 테스트했을 때 어떤 점을 관찰 했습니까? 두 경우 모두 더 많은 메모리를 사용하는 프로그램을 발견 했습니까? – Tas

+1

컴파일러의 처리 방식에 따라 다르지만 최적화되지 않은 경우 두 번째 방법이 더 좋을 수도 있습니다. –

+0

내 프로그램에서 사용하는 메모리 양을 확인하는 방법을 모르겠습니다. 나는 콘테스트를하고 있고 메모리 제한이 있기 때문에 나에게 말하지 않는 온라인 컴파일러를 사용하기 때문에 궁금하다. –

답변

0

아니요, 루프 반복마다 동일한 메모리가 사용됩니다. 그리고 원시 타입 (예 : int)을 초기화하지 않으면 그 페널티를 겪지 않습니다. 초기화가 필요한 유형으로 작업을 수행하려는 경우 두 번째 작업이 더 빠를 수도 있습니다 (단, 이러한 유형을 사용하는 경우 루프 내부에 있는지 여부는 인스턴스로 수행중인 작업에 의해 결정될 수 있음).

1

나는 복사/붙여 넣기 코드를라는 두 개의 파일로 foo.cpp에와 bar.cpp :

foo.cpp에 :

#include <iostream> 

void foo(int a, int b, int c, int d, int e) { 
     std::cout << a << b << c << d << e << std::endl; 
} 

int main(int argc, char** argv) { 
     for (int i = 0; i < argc; i++) { 
       int a, b, c, d, e; 
       std::cin >> a >> b >> c >> d >> e; 
       foo(a, b, c, d, e); 
     } 
     return 0; 
} 

bar.cpp :

#include <iostream> 

void foo(int a, int b, int c, int d, int e) { 
     std::cout << a << b << c << d << e << std::endl; 
} 

int main(int argc, char** argv) { 
     int a, b, c, d, e; 
     for (int i = 0; i < argc; i++) { 
       std::cin >> a >> b >> c >> d >> e; 
       foo(a, b, c, d, e); 
     } 
     return 0; 
} 

다음과 같이 최적화하지 않고 컴파일했습니다 (중요한 경우 gcc 버전 6.3 사용) :

g++ -O0 foo.cpp -o foo 
g++ -O0 bar.cpp -o bar 

결과 foo와 bar는 최적화되지 않은 경우에도 동일합니다. 이 확신 할하려면 objdumps을 비교할 수 있습니다

objdump -D foo > foo.txt 
objdump -D bar > bar.txt 
diff foo.txt bar.txt 

그러나, 몇 가지를 지적 :

  • int이가 있다면 아마도 대신 인스턴스 클래스의 말, 원시적 형이다 메모리 사용이 아닌 성능면에서 차이가있을 수 있습니다. 이것은 컴파일러가 (최적화없이) 결과를 동일하게 만들지 않으면 루프의 각 반복이 인스턴스를 만들고 파괴하기 때문입니다.
  • new을 사용하지 않았기 때문에 변수가 스택에서 메모리를 차지하고 있습니다.컴파일러가 두 코드에서 동일한 결과를 생성 할 수없는 경우에도 동일한 양의 메모리를 사용하게됩니다.
  • 대신 new으로 변수를 만들고 해당 변수가 내부에 작성되었을 때 삭제하지 않으면 for 루프의 경우 변수는 스택 대신 힙에서 공간을 차지하게되고 첫 번째 코드는 더 많은 메모리를 사용하게됩니다. 이 작업을 수행 할 이유가 없지만 각 루프의 끝에서 delete을 호출하여 동일한 양의 메모리를 계속 사용할 수 있습니다.