programing

GCC의 '__builtin_malloc()'는 평이한 'malloc()'에 비해 어떤 개선점을 제공합니까?

css3 2023. 10. 7. 12:08

GCC의 '__builtin_malloc()'는 평이한 'malloc()'에 비해 어떤 개선점을 제공합니까?

저는 최근에 C 라이브러리의 메모리 관리 기능 중 일부에 GCC의 내장 기능에 대해 알게 되었습니다. 특히__builtin_malloc()및 관련 기본 제공(https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html) 참조).에 대해 알게되면__builtin_malloc(), 일반적으로 성능 향상을 제공하는 것이 어떻게 작동할 수 있는지 궁금했습니다.malloc()관련 도서관 일과

예를 들어 함수가 성공할 경우 일반 호출을 통해 해제할 수 있는 블록을 제공해야 합니다.free()포인터가 자유로워질 수도 있기 때문에__builtin_malloc()아니면__builtin_free()enabled(또는 이에 대해 내가 틀린 것인지, 그리고 만일__builtin_malloc()사용됩니다. 빌트인을 전체적으로 사용해야 합니까?).따라서 할당된 개체는 일반적인 데이터 구조로 관리할 수 있는 개체여야 합니다.malloc()그리고.free()다루다

그 방법에 대해서는 자세한 내용을 찾을 수가 없습니다.__builtin_malloc()작동하거나 정확히 작동하는 것(나는 컴파일러 개발자가 아니기 때문에 GCC 소스 코드를 통해 스펠렁킹하는 것은 내 휠하우스에 없습니다)몇 가지 간단한 테스트에서 전화를 걸어 본 적이 있습니다.__builtin_malloc()직접적으로, 그것은 단순히 평이한 호출로서 객체 코드에 방출되는 것으로 끝납니다.malloc(). 그러나 이러한 간단한 테스트에서 제가 제공하지 않는 미묘한 부분이나 플랫폼 세부사항이 있을 수 있습니다.

어떤 종류의 성능 개선이 가능합니까?__builtin_malloc()전화를 걸어 명백히 하다.malloc()? 그런가요?__builtin_malloc()glibc의 다소 복잡한 데이터 구조에 의존합니다.malloc()구현 사용?아니면 반대로 글리비씨가malloc()/free()할당할 수 있는 블록을 처리할 코드가 있습니다.__builtin_malloc()?

기본적으로 어떻게 작동합니까?

나는 특별한 GCC-내부적인 실행은 없다고 믿습니다.__builtin_malloc(). 오히려 특정 상황에서 최적화할 수 있도록 내장된 형태로만 존재합니다.

예를 들어 다음과 같습니다.

#include <stdlib.h>
int main(void)
{
    int *p = malloc(4);
    *p = 7;
    free(p);
    return 0;
}

내장된 기능을 사용하지 않도록 설정하는 경우-fno-builtins) 및 생성된 출력을 확인합니다.

$ gcc -fno-builtins -O1 -Wall -Wextra builtin_malloc.c && objdump -d -Mintel a.out

0000000000400580 <main>:
  400580:   48 83 ec 08             sub    rsp,0x8
  400584:   bf 04 00 00 00          mov    edi,0x4
  400589:   e8 f2 fe ff ff          call   400480 <malloc@plt>
  40058e:   c7 00 07 00 00 00       mov    DWORD PTR [rax],0x7
  400594:   48 89 c7                mov    rdi,rax
  400597:   e8 b4 fe ff ff          call   400450 <free@plt>
  40059c:   b8 00 00 00 00          mov    eax,0x0
  4005a1:   48 83 c4 08             add    rsp,0x8
  4005a5:   c3                      ret    

호출 대상malloc/free예상대로 방출됩니다.

하지만 허용함으로써malloc붙박이로,

$ gcc -O1 -Wall -Wextra builtin_malloc.c && objdump -d -Mintel a.out

00000000004004f0 <main>:
  4004f0:   b8 00 00 00 00          mov    eax,0x0
  4004f5:   c3                      ret    

의 모든main()최적화되어 있었습니다!

기본적으로, 허용함으로써malloc기본 제공되는 GCC는 추가적인 부작용이 없기 때문에 결과를 사용하지 않을 경우 자유롭게 통화를 제거할 수 있습니다.


이는 "낭비" 통화를 허용하는 것과 동일한 메커니즘입니다.printfputs:

#include <stdio.h>

int main(void)
{
    printf("hello\n");
    return 0;
}

내장된 기능 사용 안 함:

$ gcc -fno-builtin -O1 -Wall builtin_printf.c && objdump -d -Mintel a.out

0000000000400530 <main>:
  400530:   48 83 ec 08             sub    rsp,0x8
  400534:   bf e0 05 40 00          mov    edi,0x4005e0
  400539:   b8 00 00 00 00          mov    eax,0x0
  40053e:   e8 cd fe ff ff          call   400410 <printf@plt>
  400543:   b8 00 00 00 00          mov    eax,0x0
  400548:   48 83 c4 08             add    rsp,0x8
  40054c:   c3                      ret    

내장된 기능 사용:

gcc -O1 -Wall builtin_printf.c && objdump -d -Mintel a.out

0000000000400530 <main>:
  400530:   48 83 ec 08             sub    rsp,0x8
  400534:   bf e0 05 40 00          mov    edi,0x4005e0
  400539:   e8 d2 fe ff ff          call   400410 <puts@plt>
  40053e:   b8 00 00 00 00          mov    eax,0x0
  400543:   48 83 c4 08             add    rsp,0x8
  400547:   c3                      ret    

언급URL : https://stackoverflow.com/questions/26009570/what-improvements-does-gccs-builtin-malloc-provide-over-plain-malloc