>백엔드 개발 >C++ >std::function을 사용하여 테일 호출 중에 RAX 레지스터가 스택에 푸시되는 이유는 무엇입니까?

std::function을 사용하여 테일 호출 중에 RAX 레지스터가 스택에 푸시되는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-12 19:07:10312검색

Why is the RAX Register Pushed onto the Stack During Tail Calls with std::function?

Tailcall 상황에서 스택 정렬

왜 RAX 레지스터가 생성된 어셈블리 코드의 스택에 먼저 푸시되는지에 대한 의문이 생깁니다. std::function 객체와 상호 작용하는 C 코드.

필수성 스택 정렬

64비트 ABI에서는 호출 명령 이전에 스택을 16바이트로 정렬해야 합니다. 호출이 이루어지면 8바이트 반환 주소를 스택에 푸시하여 이 정렬을 방해합니다. 이를 수정하려면 컴파일러는 후속 호출 전에 스택을 16의 배수로 다시 정렬하는 단계를 수행해야 합니다.

정렬을 위해 일회용 값 푸시

실행하는 대신 RAX와 같은 "상관 없음" 값을 푸시하는 "sub rsp, 8"은 스택 엔진이 장착된 CPU에서 더 효율적인 것으로 입증되었습니다. 이는 간단한 푸시 명령어가 하위 rsp, 8 명령어보다 더 적은 프로세서 오버헤드를 필요로 하는 경우가 많기 때문입니다.

std::function Wrapper가 없는 Tailcall과의 비교

"void g(void (*a)())" 예제에서처럼 std::function 래퍼가 존재하지 않습니다. tailcall은 간단합니다. 간단한 점프(jmp) 대상 함수에 대한 명령입니다. tailcall이 자연스럽게 적절한 스택 정렬을 유지하므로 스택 정렬에 추가 단계가 필요하지 않습니다.

위 내용은 std::function을 사용하여 테일 호출 중에 RAX 레지스터가 스택에 푸시되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.