에서 메모리를 소모하지 않습니다 ('은 calloc'는 자동으로이 질문에 대한 대답에 따라 RAM
은 calloc 실제로 메모리를 만지지 않는 것이 그것에 0을 써 넣는다) 따라서 OS가 실제 RAM (또는 스왑)으로 할당을 지원하고 있음을 확신 할 수있다. 이것은 malloc보다 느린 이유이기도하다. (OS는 또한 다른 프로세스를 스와핑하여 적절한 메모리 영역을 찾아야 만한다.)
따라서 직접 시도하기로 결정했다.
#include <stdlib.h>
#include <stdio.h>
#define ONE_MB = 1048576
int main() {
int *p = calloc(ONE_MB, sizeof(int));
int n;
for(n = 0; n != EOF; n = getchar()) ; /* Gives me time to inspect the process */
free(p);
return 0;
}
이 응용 프로그램을 실행 한 후 Windows의 작업 관리자는 RAM에서 352KB 만 사용되었다고합니다.
내가 할당 된 1MB의 블록이 OS에 의해 RAM과 백업되지 않은 것 같습니다. 내가 수동으로 배열 malloc
를 호출하고 초기화 할 경우 반면에
그러나 :
#include <stdlib.h>
#include <stdio.h>
#define ONE_MB = 1048576
int main() {
int *p = malloc(sizeof(int) * ONE_MB);
int n;
/* Manual Initialization */
for(n = 0; n < ONE_MB; n++)
memory[n] = n;
for(n = 0; n != EOF; n = getchar()) ; /* Gives me time to inspect the process */
free(p);
return 0;
}
작업 관리자 실제로 응용 프로그램에서 사용되는 RAM의 4.452KB이 있음을 보여줘 것 .
는 그의 주장에 대한 이삭이 잘못 되었습니까? 그렇다면
calloc
은 무엇을합니까? 전체 메모리 블록을 0으로 만들지 않으므로 "
이 (가)"으로 변경됩니다.
그럴 경우 첫 번째 샘플에 RAM이 사용되지 않는 이유는 무엇입니까?
'calloc()'은 메모리를 사용하지 않고, 그것을 할당합니다. http://stackoverflow.com/questions/19991623/why-is-malloc-not-using-up-the-memory-on-my-computer/19991656#19991656 "calloc 실제로 메모리를 만지는"참조하십시오 반드시 그렇지는 않습니다 . 페이지 스와핑을 사용하면 모든 제로 메모리가 적어도 작성된 데이터가 흥미로울 때까지 동일한 위치에 매핑 될 수 있습니다. – chux
귀하의 질문에 귀하가 링크 된 동일한 게시물의 댓글에 답변 된 것으로 보입니다. –
'할당 된 블록이 대부분 운영 체제에서 제공하는 새로운 제로 페이지로 구성되어 있다면, 그 블록을 그대로 둘 수 있습니다. ' 저는 1MB를 할당 할 것입니다. 처음부터 모두 0 일 가능성은 무엇입니까? –