다음 예를 고려하십시오.
struct vector {
int size() const;
bool empty() const;
};
bool vector::empty() const
{
return size() == 0;
}
다음에 대해 생성 된 어셈블리 코드 vector::empty
(clang 별, 최적화 포함) :
push rax
call vector::size() const
test eax, eax
sete al
pop rcx
ret
스택 공간을 할당하는 이유는 무엇입니까? 전혀 사용되지 않습니다. push
및 pop
생략 할 수있다. 최적화 된 MSVC 및 gcc 빌드도이 기능에 스택 공간을 사용 하므로 ( godbolt 참조 ) 이유가 있어야합니다.
스택 공간을 할당하므로 스택은 16 바이트로 정렬됩니다. 반환 주소는 8 바이트를 차지하므로 스택을 16 바이트 정렬 상태로 유지하려면 추가 8 바이트 공간이 필요합니다.
일부 컴파일러의 경우 명령 줄 인수를 사용하여 스택 프레임의 정렬을 구성 할 수 있습니다.
rsp
함수 시작 부분 에서 40 바이트를 빼는 것을 보여줍니다. 즉 , 다른 것이 이것에도 영향을 미친다는 것을 의미합니다.-mstack-alignment
옵션은 스택 정렬을 지정합니다. 문서화되지는 않았지만 기본값은 16 인 것 같습니다. 8로 설정 하면 생성 된 어셈블리 코드에서 스택 할당 ( push
및 pop
)이 사라집니다.-mpreferred-stack-boundary
옵션은 스택 정렬을 지정합니다. 주어진 값이 N이면 2 ^ N 바이트 정렬을 의미합니다. 기본값은 4이며 16 바이트를 의미합니다. 3 (예 : 8 바이트)으로 설정하면 스택 할당 ( sub
및 add
for rsp
)이 생성 된 어셈블리 코드에서 사라집니다.godbolt에서 확인하십시오 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다