2013-09-04 2 views
6

코드를보다 효율적으로 만들려고합니다. 나는 다음과 같은 것을 가지고있다 :새 크기가 이전 크기와 같을 때의 realloc 동작

typedef struct{ 
    ... 
    }MAP; 



    MAP* pPtr=NULL; 
    MAP* pTemp=NULL; 
    int iCount=0; 
    while (!boolean){ 
    pTemp=(MAP*)realloc(pPtr,(iCount+1)*sizeof(MAP)); 
    if (pTemp==NULL){ 
    ... 
    } 
    pPtr=pTemp; 
    ... 
    iCount++; 
    } 

메모리가 동적으로 할당되고있다. 나는 코드를보다 효율적으로 만들기 위해 realloc 호출을 줄이고 싶다. 새로운 크기가 이전 크기와 같으면 realloc이 어떻게 작동하는지 알고 싶습니다. 전화가 단순히 무시됩니까?

+1

OT : 적어도 (iCount + 1) * sizeof (MAP)가 더 멋지게 느껴진다. – alk

+0

@alk : 너 말이 맞아. 그것을 바꿀 것입니다. –

+0

대부분의 구현은 아마도 같은 포인터를 반환하지만 일부는 가끔 할당을 한 공간을 재배치하여 향후 할당을 쉽게 할 수있는 기회와 동일한 크기의'realloc'을 사용할 수도 있습니다. –

답변

8

보장 모든 표준 C는 : 새 객체의 내용은 할당 해제 이전의 이전 객체의 내용과 동일해야하며 새롭거나 오래된 크기보다 작아야합니다.

그러나 GNU libc를 사용하는 경우 명시 적으로 동일한 주소를 반환하는 메시지가 표시됩니다 (자세한 내용은 here 참조).

지정한 새 크기가 이전 크기와 같으면 realloc은 아무 것도 변경하지 않고 지정한 동일한 주소를 반환합니다.

+2

'realloc'은 컴파일러 인 gcc가 아니라 GNU'libc'에 의해 제공됩니다. 많은 시스템에서 gcc는 GNU libc 이외의 라이브러리와 함께 사용됩니다. –

+1

@Keith Thompson 수정 해 주신 것에 대해 감사드립니다. –

3

크기가 변경되지 않는 경우 realloc을 no-op로 간주하지 않지만 (합리적인 것으로 보이지만) 다음을 수행 할 필요가 없습니다. iCount가 변경되지 않았으므로 realloc을 호출하지 마십시오.

2

C 표준은 어떤 일이 발생 할지를 지정하지 않으므로 구현이 필요합니다. 전달 된 포인터를 반환하지 않는 절반 수준의 구현은 상상할 수 없지만 안전한 옵션은 할당 크기가 자신의 코드에서 변경되었는지 여부를 확인하는 것입니다. 또한 함수 호출을 건너 뜁니다.

은 (BTW, 그것은 필요는 없습니다. realloc에서 반환 값을 캐스팅하지 마십시오 당신이 #include <stdlib.h> 잊지 경우 정의되지 않은 동작을 숨길 수 있습니다.) 그것은 표준 C.에 지정되지 않은 것

+0

나는 실패한 경우 세그먼트 화 오류로 끝나기 때문에 realloc이 NULL을 반환하는지 확인하는 것이 중요하다고 생각합니다. 내가 아는 한, 모든 단일 realloc 호출은 출력이 NULL인지 여부를 온라인에서 확인할 수 있습니다. –

+0

@hhachem : 할당 크기가 변경되지 않는 경우 호출을 건너 뜁니다. –

관련 문제