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 중국어 웹사이트의 기타 관련 기사를 참조하세요!