나는이 같은 코드가있는 경우 :메모리에서 C++에 저장된 변수는 어디에 있습니까?
메모리에int e;
int* f;
int main() {
int a, b, c;
int* d;
}
경우는 이러한 변수가 저장됩니다? 그리고 전역 변수 (이 경우 main과 같은 함수 외부)를 정의 할 때의 문제점은 무엇입니까?
나는이 같은 코드가있는 경우 :메모리에서 C++에 저장된 변수는 어디에 있습니까?
메모리에int e;
int* f;
int main() {
int a, b, c;
int* d;
}
경우는 이러한 변수가 저장됩니다? 그리고 전역 변수 (이 경우 main과 같은 함수 외부)를 정의 할 때의 문제점은 무엇입니까?
a, b, c 및 d가 스택에 존재합니다. int (malloc 또는 new를 사용하여)의 인스턴스를 만들려면 힙을 사용하지만 스택에 'd'라는 포인터가 여전히 존재합니다.
e와 f는 응용 프로그램의 메모리 공간에서 공간을 할당하는, 이른바 '데이터 세그먼트'에서 - 참조 :
또한 스택의 크기에 대한 질문 : 그는 컴파일러에 의해 구성되어있어 여기를 참조 :
http://msdn.microsoft.com/en-us/library/tdkhxaks(VS.71).aspx
오 감사합니다. 데이터 세그먼트에 대한 정보가 매우 유용합니다! 그리고 스택 크기에 관해서는 고맙습니다. 지금은 더 명확한 것을 가지고 있습니다. :) – Puyover
최적화 컴파일러를 사용하면 스택에있는 지역 주민이 iffy 일을합니다. 개념적으로 모두 스택에 있다고 말하는 것이 유용 할 수 있지만 대부분의 경우 현실을 반영하지 않습니다. –
동의, 그들과 함께하기 위해서 그들은 레지스터 (http://en.wikipedia.org/wiki/Processor_register)로 옮겨 질 것이다. 하지만 '지역 변수가 어디에 할당되어 있습니까?'라는 질문에 대답은 '스택'입니다. –
왜 이것이 중요하다고 생각하십니까? 현대 C++에서 로컬 포인터 변수를 갖는 것은 매우 드뭅니다.
일반적인 시스템에서는 a, b, c 및 d가 스택에 있습니다. 그러나 이것이 구현 세부 사항입니다. 언어 표준은 그것에 대해 구체적으로 말하지 않습니다.
실제로 메모리에 변수를 배치하는 것에 대한 보장은 없으며 동작 만 보장됩니다. a
은 b
는 c
는 d
레지스터의 혼합과 호출 스택에있는 동안
그러나 (아마도 모든) 대부분의 실제 시스템에서
,e
및
f
는 글로벌 데이터 섹션에있을 것입니다.
f
과
d
은 모두 메모리의 어느 곳을 가리킬 수 있습니다. (물론 MMU에서는 이것이 사실이 아니기 때문에 프로세스에 매핑되는 메모리 하위 집합을 가리킬 수 있습니다).
감사. 그렇다면 성능 문제/공간없이 원하는만큼 전역 변수를 정의 할 수 있습니까? – Puyover
@Puy : 많은 전역 변수에 대한 설계상의 문제가있을 것입니다. – fredoverflow
많은 전역 변수를 가질 수 있지만, 정적으로 할당 된 변수는 모두 초기화 되어야만 프로그램 시작 속도가 느려집니다. 아마 눈치 채기에 충분하지 않을 것입니다. Fred가 말했듯이, 많은 전역 변수를 사용하면 프로그램을 유지 관리하기가 어려워 지므로 권장하지 않습니다. extern linkage가없는 file-scoped 변수가 더 좋을 것입니다. 이것은 C++의 이름없는 네임 스페이스 또는 C의 static 키워드 (C++에서는 권장하지 않음)를 사용하여 수행 할 수 있으며 전역 변수처럼 쉽게 스파게티 코드를 생성하지는 않습니다. –
주요 요점은 변수의 유효 기간을 정의하는 변수의 범위입니다. main의 변수 outsie는 프로그램 기간 동안 사용할 수 있습니다. main 내부 변수는 main() 함수의 지속 시간 동안 사용할 수 있습니다.
사실 함수 범위 변수는 스택에 할당되지만 전역 변수는 힙에 할당되지만 구현 세부 사항입니다.
전역 변수의 주된 문제점은 액세스 제어이며, 다중 스레드 프로그램에서 작업하기가 어려울 수 있습니다.
EDIT : @FredOverflow가 아래에서 지적한 것처럼, 일반적으로 전역은 실행 가능 이미지가로드 될 때 설정되는 데이터 영역에 할당됩니다.
전역 변수가 힙에서 할당되지 않았지만 데이터 세그먼트 또는 다른 것으로부터 할당 된 것입니다. – fredoverflow
@Fred - 네 말이 맞아. 내 생각이 내 타이핑을 따라 가지 못했다. ! – mdma
일반적으로 a, b, c, d *는 프로그램 스택에 정의되지만 C++ ISO 표준은 변수를 정의해야하는 위치를 지정하지 않습니다.
두 번째 질문에 대해 전역 변수의 문제는 보호 기능이 없다는 것입니다.전역 변수에 의존하는 간단한 스크립트/애플리케이션의 경우에는 괜찮을 지 모르지만 라이브러리에서는 더 복잡한 코드를 사용하면 잠재적 인 문제가 발생할 수 있습니다. 모든 코드는 언제든지 전역 범위를 사용하여 변수 값을 변경할 수 있으므로 전역 변수에 의존하는 코드는 바람직하지 않은 상태.
또한 변수가 전역 범위에 있으므로 동일한 이름의 전역 변수를 정의하는 다른 코드를 사용하면 잠재적 인 명명 충돌이 발생할 수 있습니다.
다음 내용을 읽어보십시오. http://www.gotw.ca/gotw/009.htm –
링크를 제공해 주셔서 감사합니다. – Puyover