2016-07-23 6 views
1

Mac OS에서 간단한 C++ 프로그램을 작성하고 있습니다. 난 그냥top에서 메모리 사용량이 잘못 표시 될 수 있습니다.

int main() 
{ 
    int *n = new int[50000000]; 
} 

내가 lldb에서이 프로그램을 실행하고, n가 할당 된 줄에서 중단 점을 넣어 있습니다. 그런 다음 다른 탭에서 top을 실행하면 메모리 사용량이 336K 사전 할당임을 알 수 있습니다. 내가을 lldb 안에 넣었을 때, n에 대한 할당이 일어나기 때문에, 나는 나의 메모리 사용량이 올라갈 것으로 예상한다. 그러나 위로는 내 프로그램에서 사용한 것과 같은 양의 메모리를 보여줍니다. 이것에 대한 이유는 무엇일까요? C++에서 메모리 할당이 어떻게 일어나는지 이해하려고 노력하고 있는데, 이것이 내가 이것을하고있는 이유입니다.

나는 main의 범위를 종료하지 않았습니다. 내가 다시 정상을 확인할 때, 나는 중괄호를 닫을 때 앉아있다.

+3

할당은 아마 단지 가상 주소 공간을 예약한다를 들어, 일부 프로파일 링 도구가 필요합니다. 실제 메모리는 각 페이지를 누를 때까지 OS에 의해 할당되지 않습니다. 4K마다 단일 바이트를 쓰는 for 루프를 추가하십시오. –

답변

1

top 명령은 운영 체제에서 볼 때 프로세스 통계를 보여줍니다. 얼마나 많은 메모리가 프로세스에 할당 되었는가를 보여 주지만이 메모리가 얼마나 많이 사용되고 있는지는 보여주지 않습니다. 메모리 할당을 모니터링하는 것은 정확하지 않습니다.

힙 및 프리 스토어가있는 메모리 할당은 C++에서 구현에 따라 다릅니다. 하지만 tt는 대개 OS 할당 호출로 일대일로 매핑되지 않습니다. 성능상의 이유로, 메모리가 큰 덩어리의 OS에서 수신합니다 (OS 호출은 사용자 영역 코드 내부 통화보다 더 느립니다) :

  • 은 C++ 런타임이 시작되면, 보통에서 OS에서 일부 메모리를 할당 표준 라이브러리 객체에 필요한 메모리를 할당하고, 할당 요청을 신속하게 만족시키기 위해 프리 스토어를 초기화해야합니다.
  • 이 초기 메모리가 부족한 경우에만 표준 라이브러리가 운영 체제에서 더 많은 메모리를 할당합니다.
  • 더 큰 청크로 다시 할당되므로 모든 new이 OS 호출을 발생시키는 것은 아닙니다.

귀하의 관찰에 따르면,이 초기 할당이 50MB보다 큰 것으로 추측됩니다. 차이를 확인하려면 훨씬 큰 값으로 시도하십시오. 더 정확하게 메모리 소비를 추적하려면

, 당신은 예를 valgrind 또는 heap command