답변
그 진술은 더 잘 표현할 수 있습니다. 먼저 몇 가지 관찰을해야합니다.
범위는 의미 구조입니다. 이름 (변수, 유형, 함수 등)을 사용할 수있는 위치를 정의합니다. 그리고 그 이름이 참조 할 것입니다.
다양한 유형의 범위가 있습니다. 꽤 많은 것은 단지 컴파일 시간 일뿐입니다. 예를 들어, 네임 스페이스와 클래스도 범위를 정의합니다.
기능도 범위를 정의하지만 "실행"기능을합니다. 따라서 컨텍스트에는 일종의 런타임 표현이 있어야합니다.
재귀는 동일한 함수를 호출하지만 함수 호출은 각 재 호출에 따라 달라야합니다.
마지막으로 "호출 스택"이 종종 함수 호출을 구현하는 데 사용되는 이유입니다. 각 스택 레코드는 실행중인 함수의 컨텍스트와 관련이 있습니다. 따라서 함수 범위의 이름은 호출 스택의 항목을 참조합니다.
감사! 그러나 스코프는 저장 될 수있는 무언가이기 때문에 메모리에있는 물리적 인 것이어야합니다. 그래서 스코프는 실제로 객체처럼 메모리에 저장됩니까? 또한, 나는 cppreference와 같은 다양한 출처의 스코프에 대해 많이 읽었지만 스코프가 어딘가에 저장되었다는 내용의 문장을 본 적이 없습니다. 이유가 무엇입니까? 이것도 표준 어딘가에 포함되어 있습니까 (검색해야합니다)? 감사! –
@sdsadasdasd - 범위가 저장되지 않습니다. 그것들은 의미 개념입니다. 함수 컨텍스트가 저장되고 함수의 범위는 해당 컨텍스트에 포함될 내용을 정의합니다. 그러나 범위는 저장되지 않습니다 *. – StoryTeller
흠 좋습니다.하지만 함수의 컨텍스트가 메모리의 어딘가에 저장되어 있으면 범위가 직접 저장되지 않으면 각 엔티티가 해당 범위와 얼마나 정확하게 연관되는지 알 수 없습니까? 심볼 테이블에서 수행되었거나 함수의 컨텍스트가 메모리 어딘가에 저장되어 있습니까?이 영역은 특정 범위에만 사용됩니다. 당신은 내가 훨씬 더 많은 것을 이해하게 만들었지 만, 나는 아직도 어떤 경이로움을 가지고있다. –
답변은 C++과 관련이 없습니다. C++은 실행 전에 컴파일 모델을 사용합니다 (개념적으로는 구현이 다를 수 있음). C++ 모델에서는 컴파일 타임에 범위가 분석됩니다. 컴파일러는이를 위해 일종의 스택 데이터 구조를 사용할 수 있습니다.
런타임에는 함수 호출 스택이 있습니다. 이것은 종종 함수 반환 주소와 각 활성 함수의 로컬 변수를 모두 포함하지만 C++에서는이 런타임 스택이 범위를 보유 할 필요가 없습니다.
그리고이 데이터 구조가 기호 테이블 일 수 있습니까? –
@sdsadasdasd : 좋은 시작 가정입니다. 실제 컴파일러를 _write_하고 싶다면 다른 것들도 사용할 수 있습니다. 실제 기호 테이블은 단일 데이터 구조가 아닙니다. – MSalters
하지만 여전히 얻지 못하는 것이 있습니다 : 어떤 관점에서 엔티티가 메모리와 관련이 있습니까? 스택간에 차별화 되었습니까? 그렇다면이 스택이 특정 클래스, 함수 또는 기타와 어떻게 연관되어 있습니까? –
- 1. PGT 및 PGTIOUs 저장 CAS 생성
- 2. 클래스 << 내에서 범위를 동적으로 정의
- 3. 코드 예제의 "<<< HTML"의미
- 4. groovy에서 <<의 의미
- 5. 연산자에서 순수 가상 함수 호출 <<
- 6. 배쉬 더블 리디렉션 (<< ==) 의미?
- 7. 구성 단항 함수 <= <`
- 8. .startIndex 범위를 비교하는 방법 <String.Index>
- 9. <<
- 10. 범위를 기준으로 열 복사
- 11. Heredoc <<< 또는 <<?
- 12. Swift의 "<-"의미
- 13. 처리 중 >> 및 <<의 의미
- 14. <? 및 <? php
- 15. SBT, << = 및 : =
- 16. github add <<<<<<< HEAD
- 17. QDoubleSpinBox의 경우 0.0 <min <max <1.0 범위를 지정할 수 있습니까? 예 어떻게 단계 버튼이
- 18. 목록 끝까지 범위를 어떻게 지정합니까?</p> <p>process.text.readLines [3 .. < -1]</p> <p>가 작동합니다 것 같다 :
- 19. PHP <<< OUT 및 OUT;
- 20. Swift에서 +++ 및 <<<는 무엇입니까?
- 21. R의 대입 연산자 : '<-'및 '<< -'
- 22. 스위프트 <<, ><, <=< and > = <
- 23. git "<<<<<< HEAD"
- 24. "<<<<<< HEAD"템플릿에
- 25. <<< EOT
- 26. 에코 "<! <"가 "<! >"을 반환하는 이유는 무엇입니까?
- 27. '<'연산자를 오버로드하면 cout에 대해 <<가 나옵니 까?
- 28. "list = list"가 파이썬 모듈에 미치는 영향은 무엇입니까?</p> <pre><code>list = list dict = dict </code></pre> <p>이 관용구는 무엇을 의미 하는가 :
- 29. 파이썬에서 l = (2 << 2 | 3 << 2)의 의미
- 30. 연산자 "<<"가 피연산자와 일치합니다
"스택에 스코프를 저장하는 것이 아니라"사실이 스택에 저장되므로 스코프가 제공됩니다. 이것이 즉시 이해가되지 않는다면, 힙과 스택 할당의 차이점을 읽어보십시오. – Bilkokuya
범위는 최근 물건 (함수 호출, 변수, 매개 변수)이 RAM의 일부인 스택에 푸시된다는 것을 의미하는 용어입니다. – samthegolden
스택에 스코프를 저장하는 것은 아닙니다. ** 컴파일러 **는 어디서 무엇인지 추적하기 위해이를 수행합니다. 코드가 블록을 시작하면 컴파일러는 변수 이름에 대한 새 레코드를 만들고 스택에 푸시합니다. 변수가 정의되면 이름이 가장 최근 레코드로 이동합니다. 코드가 블록을 떠날 때 스택에서 마지막 레코드를 꺼내 버립니다. 그러면 해당 블록에 정의 된 모든 이름이 제거됩니다. –