혹시 64비트 윈도우 함수호출 규약에 대해서 질문해두될까요?

기본적으로 64비트 윈도우 호출규약은 레지스터를 이용하여 파라미터를 전달하는 걸로 알고 있습니다…
그리고 파라미터가 4개 이상이라면 스택공간을 통해서 파라미터를 전달하구요…
그런데 파라미터의 개수가 4개 미만이어도 스택공간에 8바이트 x 4 만큼의 공간을 무조건 할당하던데… 혹시 이 이유에 대해서 알 수있을까요?
제가 알고 있는건 최적화 옵션을 키지않았을때, 즉 디버그하기 편하게 하려고 스택공간에 8바이트 x 4만큼의 공간을 할당후 각 인자들을 그 할당한 스택공간에 넣어서 만약 함수 내에서 뒤늦게 파라미터를 확인해야 할 상황이 온다면, 파라미터 파악을 쉽게 하기 위함이라고 알고 있습니다.
그런데 최적화 옵션을 킨 상황에도 8바이트 x 4만큼의 공간 할당은 하더라구요(비록 그 스택에 인자들을 다시 넣는 작업은 하지 않지만…) 이건 왜 이럴까요??

오버플로 검출용 아닐까요?

컴파일러와 최적화 옵션도 적어주시면 자세하게 확인할 수 있을 것 같습니다.

calling convention 과 컴파일러 설정에 달린 문제입니다.

register 를 통한 parameter 전달은 기본적으론 fastcall 이예요. 컴파일러마다 다 달라요.
그걸 최적화 옵션에서 다시 뒤집는것도 컴파일러 옵션이죠. UB 니, 규칙이라고 말할 수 있는게 없습니다.

참고: WSL GCC 9.2 기준 O2 이상의 최적화에서는 추가적인 할당 없이 call합니다.

https://docs.microsoft.com/ko-kr/cpp/build/reference/favor-optimize-for-architecture-specifics?view=vs-2019

답변주셔서 감사합니다. 컴파일러 옵션관련해서 찾아봐야겠네요.