2014-06-23 2 views
1

놀랍게도 메타 데이터를 저장하는 두 프로그램의 malloc 저장소의 메타 데이터가 내가 찾아 무엇을하려고 하였다 않습니다 정확히 어떻게 데이터 유형이 다르다하더라도 같은 두 포인터의 차이 .....malloc에 ​​

했다 이 작은 실험으로 알아 ...

프로그램 1 :

int main() 
{ 
    char *i,*j; 

    i=(char*)malloc (sizeof(char)); 
    j=(char*)malloc (sizeof(char)); 

    printf ("%x\n",i); 

    printf ("%x\n",j); 
return 0; 
} 

출력 :

710010 
710030 
,

프로그램 2 :

int main() 
{ 
    int *i,*j; 

    i=(int*)malloc (sizeof(int)); 
    j=(int*)malloc (sizeof(int)); 

    printf ("%x\n",i); 

    printf ("%x\n",j); 
return 0; 
} 

출력 : 내가이 프로그램을하기 전에 생각했던 어떤

16b8010 
16b8030 

:

| meta data of i | memory space of i | meta data of j | memory space of j | 

을하지만 결과는 이론을 지원하지 않습니다 ....

+1

참고 : [malloc의 결과를 캐스팅하지 마십시오.] (http://stackoverflow.com/q/605845/119527). –

+1

^부적합한 의견 – PRP

+0

malloc() 함수는 이중 연결리스트와 함께 다른 오버 헤드를 더한 것으로 작동합니다. 따라서 연속적인 malloc 호출은 서로간에 예상되는 오프셋으로 주소를 반환하지 않습니다. 또한 함수 호출에서 char이 int로 승격됩니다. 또한 malloc()의 대부분의 구현은 필요한 수학 계산량을 줄이기 위해 최소 크기의 배수로 메모리를 사용합니다. 또한 많은 malloc() 구현체는 미리 할당 된 메모리 풀과 함께 작동합니다. 결과는 거의 모든 malloc() 호출이 실제로 예상보다 많은 메모리를 실제로 확보합니다. – user3629249

답변

4

malloc 컴파일 타임에 편리한 크기로 할당을 "반올림"합니다. 도서관. 이로 인해 후속 할당 및 할당 해제가 요청을 정확히 일치시키기 위해 할당이 생성 된 경우보다 조각 메모리에 더 적게 발생합니다.

여기서 malloc은 메타 데이터를 저장하지 않으므로 두 값이 모두 0x20 "떨어져 있음"인 이유는 아닙니다. 그러나 당신은 malloc (그리고 친구들)을 구현하는 한 가지 방법을 읽을 수 있습니다. here; 특히 슬라이드 16 및 28을 참조하십시오.

"무작위"순서로 많은 크기의 할당이 많이 발생하는 문자열 조작 프로그램의 경우를 상상해보십시오. 작은 "남겨진"청크는 빠르게 개발되어 사용 된 청크 사이에 완전히 쓸모없는 메모리를 남겨 두었습니다. malloc은 모든 최소 메모리 크기 (이 경우 0x20)의 배수로 모든 메모리 요청을 충족시킴으로써이를 방지합니다. (기술적으로 0x1E 바이트 요청 기술적으로 당신의 요청 후 왼쪽 및 사용되지 않는 2 바이트 "낭비 된"공간이됩니다 .malloc 0x1E 대신 0x20 바이트를 할당하는 있지만 2-byte 조각이 남아 있지 않습니다. 에 대한 메타 데이트가 2 바이트보다 확실히 크기 때문에이 바이트를 추적 할 방법이 없을 수도 있습니다.)

+0

당신의 대답을 좀 자세히 설명해 주시겠습니까? 나는 malloc이 메타 데이터를 저장하고있는 곳을 정확히 알고 싶습니다. – PRP

0

malloc은 일반적으로 메모리 풀을 사용하며 "메타 데이터"는 다음과 같습니다. 할당 된 메모리 덩어리의 "중간"이 아닌 풀에서 개최됩니다.