Programing

스택에 너무 많은 공간이 할당 된 이유는 무엇입니까?

lottogame 2020. 11. 28. 08:36
반응형

스택에 너무 많은 공간이 할당 된 이유는 무엇입니까?


이 질문은 스택 오버플로 질문에 대한 답변에서 나옵니다. 책에서 "컴파일러가 메모리의 변수를위한 공간을 할당합니다"라고 말하는 이유는 무엇입니까? , 여기서 나는 스택에 변수를 할당 할 때 어떤 일이 발생하는지와 컴파일러가 할당 할 메모리 크기를 알고있는 코드를 생성하는 방법을 OP에 보여 주려고했습니다. 분명히 컴파일러는 필요한 것보다 훨씬 더 많은 공간을 할당합니다.

그러나 다음을 컴파일 할 때

#include <iostream>
using namespace std;

int main()
{
    int foo;
    return 0;
}

최적화없이 디버그 모드에서 컴파일 된 Visual C ++ 2012를 사용하여 다음 어셈블러 출력을 얻습니다.

int main()
{
00A31CC0  push        ebp
00A31CC1  mov         ebp,esp
00A31CC3  sub         esp,0CCh  // Allocates 204 bytes here.
00A31CC9  push        ebx
00A31CCA  push        esi
00A31CCB  push        edi
00A31CCC  lea         edi,[ebp-0CCh]
00A31CD2  mov         ecx,33h
00A31CD7  mov         eax,0CCCCCCCCh
00A31CDC  rep stos    dword ptr es:[edi]
   int foo;
   return 0;
00A31CDE  xor         eax,eax
}

int내 프로그램에 하나 더 추가하면 위의 주석 줄이 다음과 같이 표시됩니다.

00B81CC3  sub         esp,0D8h // Allocate 216 bytes

내 대답에서 @JamesKanze가 제기 한 질문은 컴파일러가 왜 컴파일러인지이며 분명히 Visual C ++ (다른 컴파일러로 실험을하지 않았 음)뿐만 아니라 각각 204 바이트와 216 바이트가 할당되었습니다. 4 개만 필요하고 두 번째는 8 개만 필요합니까?

이 프로그램은 32 비트 실행 파일을 만듭니다.

기술적 인 관점에서 4 바이트 대신 204 바이트를 할당해야하는 이유는 무엇입니까?

편집하다:

두 개의 함수를 호출 하고 메인에서 a double와 2 int생성 하면

 01374493  sub         esp,0E8h  // 232 bytes

위의 편집과 동일한 프로그램에 대해 릴리스 모드 (최적화 없음)에서 다음을 수행합니다.

 sub    esp, 8                // Two ints
 movsd  QWORD PTR [esp], xmm0 // I suspect this is where my `double` goes

이 추가 공간은 / Zi 컴파일 옵션에 의해 생성됩니다. 편집 + 계속을 활성화합니다. 추가 공간은 디버깅하는 동안 코드를 편집 할 때 추가 할 수있는 로컬 변수에 사용할 수 있습니다.

또한 / RTC의 효과를보고 있으며 모든 로컬 변수를 0xcccccccc로 초기화하므로 변수 초기화를 잊어 버려서 문제를 진단하기가 더 쉽습니다. 물론이 코드는 기본 릴리스 구성 설정에서 생성되지 않습니다.

참고 URL : https://stackoverflow.com/questions/15806673/why-is-so-much-space-allocated-on-the-stack

반응형