2017-11-08 3 views
3

나는이 문장 (source)가 발생?범위가 스택에 저장되어 있습니까?</p> <blockquote> <p>가 스택</p> </blockquote> <p>하지만 어떻게/왜 범위를 저장 할의 함수 호출 및 범위를 넣어 의미

+0

"스택에 스코프를 저장하는 것이 아니라"사실이 스택에 저장되므로 스코프가 제공됩니다. 이것이 즉시 이해가되지 않는다면, 힙과 스택 할당의 차이점을 읽어보십시오. – Bilkokuya

+0

범위는 최근 물건 (함수 호출, 변수, 매개 변수)이 RAM의 일부인 스택에 푸시된다는 것을 의미하는 용어입니다. – samthegolden

+0

스택에 스코프를 저장하는 것은 아닙니다. ** 컴파일러 **는 어디서 무엇인지 추적하기 위해이를 수행합니다. 코드가 블록을 시작하면 컴파일러는 변수 이름에 대한 새 레코드를 만들고 스택에 푸시합니다. 변수가 정의되면 이름이 가장 최근 레코드로 이동합니다. 코드가 블록을 떠날 때 스택에서 마지막 레코드를 꺼내 버립니다. 그러면 해당 블록에 정의 된 모든 이름이 제거됩니다. –

답변

2

그 진술은 더 잘 표현할 수 있습니다. 먼저 몇 가지 관찰을해야합니다.

  1. 범위는 의미 구조입니다. 이름 (변수, 유형, 함수 등)을 사용할 수있는 위치를 정의합니다. 그리고 그 이름이 참조 할 것입니다.

  2. 다양한 유형의 범위가 있습니다. 꽤 많은 것은 단지 컴파일 시간 일뿐입니다. 예를 들어, 네임 스페이스와 클래스도 범위를 정의합니다.

  3. 기능도 범위를 정의하지만 "실행"기능을합니다. 따라서 컨텍스트에는 일종의 런타임 표현이 있어야합니다.

  4. 재귀는 동일한 함수를 호출하지만 함수 호출은 각 재 호출에 따라 달라야합니다.

마지막으로 "호출 스택"이 종종 함수 호출을 구현하는 데 사용되는 이유입니다. 각 스택 레코드는 실행중인 함수의 컨텍스트와 관련이 있습니다. 따라서 함수 범위의 이름은 호출 스택의 항목을 참조합니다.

+0

감사! 그러나 스코프는 저장 될 수있는 무언가이기 때문에 메모리에있는 물리적 인 것이어야합니다. 그래서 스코프는 실제로 객체처럼 메모리에 저장됩니까? 또한, 나는 cppreference와 같은 다양한 출처의 스코프에 대해 많이 읽었지만 스코프가 어딘가에 저장되었다는 내용의 문장을 본 적이 없습니다. 이유가 무엇입니까? 이것도 표준 어딘가에 포함되어 있습니까 (검색해야합니다)? 감사! –

+0

@sdsadasdasd - 범위가 저장되지 않습니다. 그것들은 의미 개념입니다. 함수 컨텍스트가 저장되고 함수의 범위는 해당 컨텍스트에 포함될 내용을 정의합니다. 그러나 범위는 저장되지 않습니다 *. – StoryTeller

+0

흠 좋습니다.하지만 함수의 컨텍스트가 메모리의 어딘가에 저장되어 있으면 범위가 직접 저장되지 않으면 각 엔티티가 해당 범위와 얼마나 정확하게 연관되는지 알 수 없습니까? 심볼 테이블에서 수행되었거나 함수의 컨텍스트가 메모리 어딘가에 저장되어 있습니까?이 영역은 특정 범위에만 사용됩니다. 당신은 내가 훨씬 더 많은 것을 이해하게 만들었지 만, 나는 아직도 어떤 경이로움을 가지고있다. –

0

답변은 C++과 관련이 없습니다. C++은 실행 전에 컴파일 모델을 사용합니다 (개념적으로는 구현이 다를 수 있음). C++ 모델에서는 컴파일 타임에 범위가 분석됩니다. 컴파일러는이를 위해 일종의 스택 데이터 구조를 사용할 수 있습니다.

런타임에는 함수 호출 스택이 있습니다. 이것은 종종 함수 반환 주소와 각 활성 함수의 로컬 변수를 모두 포함하지만 C++에서는이 런타임 스택이 범위를 보유 할 필요가 없습니다.

+0

그리고이 데이터 구조가 기호 테이블 일 수 있습니까? –

+0

@sdsadasdasd : 좋은 시작 가정입니다. 실제 컴파일러를 _write_하고 싶다면 다른 것들도 사용할 수 있습니다. 실제 기호 테이블은 단일 데이터 구조가 아닙니다. – MSalters

+0

하지만 여전히 얻지 못하는 것이 있습니다 : 어떤 관점에서 엔티티가 메모리와 관련이 있습니까? 스택간에 차별화 되었습니까? 그렇다면이 스택이 특정 클래스, 함수 또는 기타와 어떻게 연관되어 있습니까? –