2012-09-05 2 views
2

제 생각에 각 스레드는 일반적으로 하나의 스택 만 가져옵니다 (프로세스의 모든 스레드는 일반적으로 힙을 공유합니다). 저는 스택이 함수 호출이 발생할 때 프로그램 카운터 (PC)의 값을 저장하는 데 사용되는 것으로 항상 생각했습니다. 그러나 나는 어딘가에서 integer 또는 boolean과 같은 특정 변수 유형을 스택에 할당합니다. 스택의 값은 엄격한 FILO 방식으로 관리되기 때문에 언제 이러한 변수를 검색 할 수 있습니까?변수가 스택에 할당되면 언제든지 변수를 검색 할 수 있습니까?

예를 들어, int a, b, c;을 선언 한 후에는 범위 내에서 언제든지 이러한 변수를 원하는 순서대로 지정할 수 있습니다. 어떻게 이뤄지나요? 왜 스택의 맨 위에 값이 c이 아니며 값이 a, b입니까?

답변

1

호출 스택은 로컬 변수 및 함수에 매개 변수를 전달하는데도 사용됩니다.

참조 유형은 힙에 할당되지만 '참조 값 유형'은 스택에 전달되지만 참조 유형이 매개 변수로 사용될 때이 힙 위치에 대한 포인터는 계속 전달됩니다 스택

스택은 대개 LIFO 버퍼로 인식되지만 호출 스택과 관련된 프레임 또는 기본 포인터가 있으며 현재 스택 포인터의 위 또는 아래 메모리에 직접 액세스하는 데 사용할 수 있습니다. 이것은 함수가 스택 포인터를 변경하지 않고도 매개 변수에 대한 임의 액세스를 계속 유지할 수있는 방법입니다.

diagram from Wikipedia은 이것을 시각화하는 데 유용 할 수 있지만 많은 사람들이 스택이 '아래쪽으로'자라야한다고 주장합니다.

이 블로그 게시물 here 인텔 호출 난 당신이 일반적으로 좀 더에 스택을 연구 (/ CS 책을 인터넷 검색을 통해 WikipediaStack Explanation 등 참조)해야 좋을 것

1

첫째을 스택을 설명합니다.

그러나 특정 질문에 대해서는 생성 된 힙이 아닌 모든 변수가 스택에 있습니다. 이것은 일반적으로 (C++ 및 Java에서 new 연산자를 통해) 직접 힙 할당되지 않은 특정 함수 내에서 정의한 모든 것을 포함합니다. 어떤 언어에서는 모든 것이 힙에 할당되어 있고 그 힙 구조에 대한 포인터 만 스택에 저장됩니다 (예 : Python). 언어 간 이러한 사소한 변화가 다양하게 나타날 것입니다.

정수와 부 울린에 대한 귀하의 성명은 항상 스택에있는 올바르지 않습니다. new으로 함수를 빌드하면 힙에 함수를 정의하면 스택에 있습니다. Java에서 int 프리미티브를 사용하면 일반적으로 스택 기반이며 Integer 개체가 힙 기반이라는 점에 유의하십시오. 그러나 이는 기본 스택 지식 이상의 Java의 고급 뉘앙스입니다.

동일한 범위 내에서 모두 int a, b, c;에 액세스 할 수 있습니다. 이는 해당 기능 스택 범위 내의 모든 3 개의 변수를위한 공간을 만들기 때문입니다. 함수가 반환하면 스택을 다시 이동하면서 이러한 변수가 정리됩니다. 그 시점까지는 전체 스코프 블록이 스택의 FILO 구조의 일부이기 때문에 모두 3 개가 존재하며 반환 할 때까지 계속 유지됩니다.

1

어떤 환경에서 작업하는지에 따라 그 질문에 대한 답이 많습니다. 확실히 (컴퓨터 코드 POP 및 PUSH와 함께 사용되는) 지침과 스택을 동일시하지 말아야합니다 stackframe) 파이썬 인터프리터 또는.그물 런타임

하지만 짧은 대답은 스택의 상단이 단순히 메모리 위치입니다, 그래서 당신은 단순히 사용 당신은 그래서

B의 주소 C, A, B를 밀어 않은 경우

오프셋 (offset) 스택 주소 - 4가됩니다.

관련 문제