스택에 너무 많은 공간이 할당 된 이유는 무엇입니까?
이 질문은 스택 오버플로 질문에 대한 답변에서 나옵니다. 책에서 "컴파일러가 메모리의 변수를위한 공간을 할당합니다"라고 말하는 이유는 무엇입니까? , 여기서 나는 스택에 변수를 할당 할 때 어떤 일이 발생하는지와 컴파일러가 할당 할 메모리 크기를 알고있는 코드를 생성하는 방법을 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
'Programing' 카테고리의 다른 글
"."뒤의 문자열 부분을 제거합니다. (0) | 2020.11.28 |
---|---|
git diff를 grep하는 방법? (0) | 2020.11.28 |
Ember.Application 등록 및 주입 방법을 언제 어떻게 사용합니까? (0) | 2020.11.28 |
앤티 앨리어싱을 유지하면서 선명한 가장자리로 svg 요소를 렌더링하는 방법은 무엇입니까? (0) | 2020.11.28 |
React Redux에서 스토어 상태에 어떻게 액세스합니까? (0) | 2020.11.28 |