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는 추가적인 부작용이 없기 때문에 결과를 사용하지 않을 경우 자유롭게 통화를 제거할 수 있습니다.
이는 "낭비" 통화를 허용하는 것과 동일한 메커니즘입니다.printf
puts
:
#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
'programing' 카테고리의 다른 글
NonUnique DiscoveredSqlAlias예외:중복된 sql 별칭 [ASC_]이(가) 발견되었습니다.ID] native-sql 쿼리 자동 검색 중 (0) | 2023.10.07 |
---|---|
printfinside CUDA __global__ 기능 (0) | 2023.10.07 |
MariaDB는 응시하고 있지 않습니다. (0) | 2023.10.07 |
판매중인 상품 확인 방법 - WooCommerce (0) | 2023.10.07 |
다른 경우가 아니라 반품/계속 문을 사용해야 합니까? (0) | 2023.10.07 |