source

xmalloc과 malloc의 차이점은 무엇입니까?

goodcode 2022. 8. 12. 23:22
반응형

xmalloc과 malloc의 차이점은 무엇입니까?

xmalloc() ★★★★★★★★★★★★★★★★★」malloc()모리할 할당 ?용 ??? ???
xmalloc()

xmalloc()success or die라는 모토를 가진 비표준 함수입니다.메모리 할당에 실패하면 프로그램이 종료되고 에러 메시지가 출력됩니다.stderr.

할당 자체는 다르지 않습니다.메모리를 할당할 수 없는 경우의 동작만 다릅니다.

malloc()아!

xmalloc는 표준 라이브러리의 일부가 아닙니다. 많은 GNU 에서 흔히 수 있는 게으른 이는 GNU 소프트웨어에서 호출됩니다.abortmalloc 실패합니다, 변환되는 경우도 .malloc(0)malloc(1) 확실하게 xmalloc(0)이치노

경우든, 「」입니다.abort에 열중하는.malloc실패는 특히 라이브러리 코드의 경우 매우 나쁜 행동입니다.가장 악명 높은 예 중 하나는 GMP(GNU 멀티 정밀도 산술 라이브러리)로, 계산용 메모리가 부족할 때마다 호출 프로그램을 중단합니다.

올바른 라이브러리 레벨의 코드는, 도중에 부분적으로 완료된 조작을 모두 취소하고, 에러 코드를 발신자에게 반환하는 것으로, 항상 할당 에러를 처리할 필요가 있습니다.그 후, 콜 프로그램은, 중요한 데이터의 보존을 수반하는 처리를 결정할 수 있습니다.

다른 분들이 언급하셨듯이xmalloc는 OS OS를 되는 경우가 매우 .malloc으로 불리다abort ★★★★★★★★★★★★★★★★★」exit실패했을 경우.그러나 많은 프로젝트에는 다음과 같은 기능이 포함되어 있습니다.xmalloc종료하기 전에 애플리케이션 상태를 저장하려고 하는 함수(예: neovim 참조).

는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.xmalloc프로젝트 고유의 확장으로서 malloc출구가 아니라 malloc전화하지 않은 버전은 본 적이 없지만abort ★★★★★★★★★★★★★★★★★」exit그들 중 몇몇은 그것보다 더 많은 을 한다.

이 질문에 대한 은 '어느 차이가 입니다.xmalloc ★★★★★★★★★★★★★★★★★」malloc황황 르 xmalloc비표준적인 프로젝트 고유의 기능이기 때문에 어떤 작업도 할 수 있습니다.확실히 알 수 있는 유일한 방법은 코드를 읽는 거예요.

xmalloc

https://gcc.gnu.org/onlinedocs/libiberty/index.html 는 GNU 유틸리티 라이브러리입니다.

mallocANSI C の ansi ansi ansi 。

xmallocGCC나 Binutils를 포함한 많은 중요한 GNU 프로젝트에 소스로 포함되어 있는 경우가 많습니다.둘 다 많이 사용합니다.에는 Ubuntu가 있습니다.libiberty-dev★★★★★★★★★★★★★★★★★★.

xmallochttps://gcc.gnu.org/onlinedocs/libiberty/Functions.html 에서 설명되며, GCC 5.2.0 에서는 libiberty/xmalloc.c 에 실장되어 있습니다.

PTR
xmalloc (size_t size)
{
  PTR newmem;

  if (size == 0)
    size = 1;
  newmem = malloc (size);
  if (!newmem)
    xmalloc_failed (size);

  return (newmem);
}

void
xmalloc_failed (size_t size)
{
#ifdef HAVE_SBRK
  extern char **environ;
  size_t allocated;

  if (first_break != NULL)
    allocated = (char *) sbrk (0) - first_break;
  else
    allocated = (char *) sbrk (0) - (char *) &environ;
  fprintf (stderr,
       "\n%s%sout of memory allocating %lu bytes after a total of %lu bytes\n",
       name, *name ? ": " : "",
       (unsigned long) size, (unsigned long) allocated);
#else /* HAVE_SBRK */
  fprintf (stderr,
       "\n%s%sout of memory allocating %lu bytes\n",
       name, *name ? ": " : "",
       (unsigned long) size);
#endif /* HAVE_SBRK */
  xexit (1);
}

/* This variable is set by xatexit if it is called.  This way, xmalloc
   doesn't drag xatexit into the link.  */
void (*_xexit_cleanup) (void);

void
xexit (int code)
{
  if (_xexit_cleanup != NULL)
    (*_xexit_cleanup) ();
  exit (code);
}

다른 사람들이 언급했듯이, 이것은 매우 간단합니다.

  • 해보다malloc
  • 실패하면
    • 오류 메시지 인쇄
    • exit

K&R C에서의 xmalloc.c의 원시적인 예

#include <stdio.h>
extern char *malloc ();
void *
xmalloc (size)
    unsigned size;
{
  void *new_mem = (void *) malloc (size);
  if (new_mem == NULL)    
    {
      fprintf (stderr, "fatal: memory exhausted (xmalloc of %u bytes).\n", size);
      exit (-1);
    }
  return new_mem;
}

코드 헤더에 (조기)를 입력합니다.

#define malloc(m) xmalloc(m)

컴파일 전에 소스를 사일런트하게 재작성합니다.(C 프리프로세서를 직접 기동하여 출력을 저장함으로써 고쳐 쓴 코드를 확인할 수 있습니다.)

프로그램 크래시가 당신이 원하는 것이 아니라면 당신은 뭔가 다른 것을 할 수 있다.

  • 가비지 콜렉터 사용
  • 코드 재설계를 통해 메모리 호그가 줄어들도록 합니다.
  • 메모리 부족 또는 기타 할당 오류를 정상적으로 처리하기 위해 프로그램에서 코드를 체크하는 오류가 발생하였습니다.

사용자는 프로그램에 내장된 크래시 명령에 의해 데이터가 손실되는 것을 즐기지 않습니다.

IBM AIX에서 작업하면서 xmalloc을 본 적이 있습니다. xmalloc은 AIX에서 제공하는 커널 서비스입니다.

내 생각에 함수의 man 페이지만큼 함수를 잘 설명할 수 있는 것은 없다.그래서 man page에서 아래 내용을 붙여넣고 있습니다.

목적:메모리를 할당합니다.

구문:

caddr_t xmalloc (사이즈, 얼라인먼트, 힙)

파라미터:

size : 할당할 바이트 수를 지정합니다.

align: 할당된 메모리의 정렬 특성을 지정합니다.

heap : 메모리를 할당할 힙의 주소를 지정합니다.

설명:

xmalloc 커널 서비스는 히프 파라미터로 지정된 히프에서 메모리 영역을 할당합니다.이 영역은 size 파라미터로 지정된 길이의 바이트 수로 align 파라미터로 지정된 바이트 경계에 정렬됩니다.align 파라미터는 실제로 원하는 주소 경계의 로그 베이스 2입니다.예를 들어 4의 정렬 값은 할당된 영역을 2^4(16) 바이트 경계에 정렬하도록 요구합니다.

커널 확장에서 사용하기 위해 커널에서 제공하는 여러 힙이 있습니다.2개의 주요 커널 힙은 kernel_heap과 pinned_heap입니다.커널 확장에서는 고정되지 않은 메모리를 할당할 때 kernel_heap 값을 사용해야 합니다.또한 항상 고정 또는 고정되어야 하는 메모리를 할당할 때는 pinned_heap 값을 사용해야 합니다.pinned_heap 힙에서 할당하는 경우 xmalloc 커널 서비스는 정상적으로 반환되기 전에 메모리를 핀합니다.한정된 시간 동안만 메모리를 고정해야 하는 경우 커널 서비스를 사용하여 kernel_heap 힙에서 메모리를 고정하고 분리해야 합니다.kernel_heap 힙의 메모리를 해제한 후 해제해야 합니다.pinned_heap 힙의 메모리는 핀을 해제하지 마십시오.

이 기능에 대해 자세히 알고 싶다면 IBM AIX 지원 링크를 방문하십시오.

언급URL : https://stackoverflow.com/questions/7590254/what-is-the-difference-between-xmalloc-and-malloc

반응형