메모리 사용량에 대한 자세한 내용과 C++를 사용하여 측정하는 방법을 배우려고합니다. <Windows.h>
을 포함 할 때 내가 Windows에서, RAM의 양을 검색하는 빠른 방법은 현재 응용 프로그램 프로세스에 의해 사용되는 것을 알고있다 :GetProcessMemoryInfo를 사용하여 정적 배열 메모리 사용을 측정 할 수 없습니다.
PROCESS_MEMORY_COUNTERS info;
GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
(uint64_t)info.WorkingSetSize;
다음, 나는 아주 간단한 테스트를 실행하는 사용 나는 위의 코드를 실행할 때 나는 전혀 이해하지 못하는 어떤
#include <iostream>
#include <Windows.h>"
int main(void)
{
uint64_t currentUsedRAM(0);
PROCESS_MEMORY_COUNTERS info;
GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
currentUsedRAM = info.WorkingSetSize;
const int N(1000000);
int x[N]; //in the second run, comment this line out
int y[N]; //in the second run, comment this line out
//int *x = new int[N]; //in the second run UNcomment this line out
//int *y = new int[N]; //in the second run UNcomment this line out
for (int i = 0; i < N; i++)
{
x[i] = 1;
y[i] = 2;
}
GetProcessMemoryInfo(GetCurrentProcess(), &info, sizeof(info));
currentUsedRAM = info.WorkingSetSize - currentUsedRAM;
std::cout << "Current RAM used: " << currentUsedRAM << "\n";
return 0;
}
는, 출력은 다음과 같습니다 Current RAM used: 0
, 나는 1 개 백만 항목을 각각 두 1D int
배열을 작성하기 때문에 내가 8메가바이트 주위에 뭔가를 기대하고있다. 자, 코드를 다시 실행했지만 x
과 y
을 dinamically 할당 된 배열로 만들면 이제 예상대로 결과가 출력됩니다 : Current RAM used: 8007680
.
왜 그럴까요? 두 경우 모두 메모리 사용을 탐지하는 방법은 무엇입니까?
두 개의 배열에 대해 스택에 거의 8 메가의 메모리를 할당했기 때문에 프로그램이 시작되는 것에 놀랐습니다. Windows의 기본 스택 크기는 대개 단일 MB입니다. 그리고 이것으로 왜 예상 결과를 얻지 못했는지에 대한 힌트를 얻어야합니다. –
@Someprogrammerdude 그건 정확히 ** 의심 스러워요. 필자의 직감은 함수가 스택에서가 아니라 힙에서의 메모리 할당만을 측정한다는 것이었다. 그러나 응용 프로그램이 실행되기 때문에 어떤 일이 벌어지고 있는지 이해할 수 없었습니다. 따라서 함수가 힙 메모리 사용 만 가져옵니다. 스택 메모리 사용량을 계산하는 방법이 있습니까? –
컴파일은 두 배열을 최적화했습니다. 이를 방지하기 위해 부작용을 만들 수 있습니다 : 요소의 합을 출력하십시오. – felix