지역 변수 생성을 위해 Push/Pop 명령어를 활용할 수 있는 C/C 컴파일러는 무엇입니까?
소개
ESP를 점진적으로 늘리는 일반적인 관행과 달리 이 질문은 코드 간결성 및 성능 최적화를 목표로 로컬 변수를 설정하기 위해 푸시 및 팝 명령을 사용할 수 있습니다.
컴파일러 고려 사항
컴파일러 최적화:
스택 엔진 최적화:
코드 샘플
다음 사항을 고려하세요 예:
int extfunc(int *, int *); void foo() { int a=1, b=2; extfunc(&a, &b); }
컴파일러 출력
GCC, ICC, MSVC 및 clang은 모두 푸시 명령으로 시작하고 이어서 스택 조작 및 호출이 이어지는 코드를 생성합니다. extfunc로. 이는 최신 컴파일러가 최적화를 위해 푸시를 활용한다는 관찰과 일치합니다.
최적 솔루션
더욱 최적화된 솔루션은 다음과 같습니다.
push 2 # only 2 bytes lea rdi, [rsp + 4] mov dword ptr [rdi], 1 mov rsi, rsp # special case for lea rsi, [rsp + 0] call extfunc(int*, int*) pop rax # alternative to add rsp,8 ret
이 경우 단일 푸시 명령은 스택을 16바이트 정렬된 상태로 유지하면서 두 지역 변수 모두에 공간을 할당합니다. 이는 코드 크기를 최적화하고 효율성을 유지합니다.
추가 고려 사항
위 내용은 최신 C/C 컴파일러는 효율적인 지역 변수 관리를 위해 푸시/팝 명령어를 활용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!