2010-06-26 2 views
0

나는이 같은 코드가있는 경우 :메모리에서 C++에 저장된 변수는 어디에 있습니까?

메모리에
int e; 
int* f; 

int main() { 
    int a, b, c; 
    int* d; 
} 

경우는 이러한 변수가 저장됩니다? 그리고 전역 변수 (이 경우 main과 같은 함수 외부)를 정의 할 때의 문제점은 무엇입니까?

+4

다음 내용을 읽어보십시오. http://www.gotw.ca/gotw/009.htm –

+0

링크를 제공해 주셔서 감사합니다. – Puyover

답변

6

a, b, c 및 d가 스택에 존재합니다. int (malloc 또는 new를 사용하여)의 인스턴스를 만들려면 힙을 사용하지만 스택에 'd'라는 포인터가 여전히 존재합니다.

e와 f는 응용 프로그램의 메모리 공간에서 공간을 할당하는, 이른바 '데이터 세그먼트'에서 - 참조 :

http://en.wikipedia.org/wiki/Data_segment

또한 스택의 크기에 대한 질문 : 그는 컴파일러에 의해 구성되어있어 여기를 참조 :

http://msdn.microsoft.com/en-us/library/tdkhxaks(VS.71).aspx

+0

오 감사합니다. 데이터 세그먼트에 대한 정보가 매우 유용합니다! 그리고 스택 크기에 관해서는 고맙습니다. 지금은 더 명확한 것을 가지고 있습니다. :) – Puyover

+0

최적화 컴파일러를 사용하면 스택에있는 지역 주민이 iffy 일을합니다. 개념적으로 모두 스택에 있다고 말하는 것이 유용 할 수 있지만 대부분의 경우 현실을 반영하지 않습니다. –

+0

동의, 그들과 함께하기 위해서 그들은 레지스터 (http://en.wikipedia.org/wiki/Processor_register)로 옮겨 질 것이다. 하지만 '지역 변수가 어디에 할당되어 있습니까?'라는 질문에 대답은 '스택'입니다. –

3

왜 이것이 중요하다고 생각하십니까? 현대 C++에서 로컬 포인터 변수를 갖는 것은 매우 드뭅니다.

일반적인 시스템에서는 a, b, c 및 d가 스택에 있습니다. 그러나 이것이 구현 세부 사항입니다. 언어 표준은 그것에 대해 구체적으로 말하지 않습니다.

+0

어떤 방법으로도 표준 PC에서 스택의 크기를 알 수 있습니까? – Puyover

+0

스택 크기는 스레드에 따라 다릅니다. –

+0

... 주어진 스레드의 스택 크기가 OS에 따라 다른지 확인하십시오. Windows에서는 스레드 정보 블록 (32 비트) 또는 스레드 환경 블록 (64 비트)을 검색하여이 정보를 얻을 수 있습니다. – stinky472

9

실제로 메모리에 변수를 배치하는 것에 대한 보장은 없으며 동작 만 보장됩니다. abcd 레지스터의 혼합과 호출 스택에있는 동안

그러나 (아마도 모든) 대부분의 실제 시스템에서

, ef는 글로벌 데이터 섹션에있을 것입니다. fd은 모두 메모리의 어느 곳을 가리킬 수 있습니다. (물론 MMU에서는 이것이 사실이 아니기 때문에 프로세스에 매핑되는 메모리 하위 집합을 가리킬 수 있습니다).

+0

감사. 그렇다면 성능 문제/공간없이 원하는만큼 전역 변수를 정의 할 수 있습니까? – Puyover

+4

@Puy : 많은 전역 변수에 대한 설계상의 문제가있을 것입니다. – fredoverflow

+0

많은 전역 변수를 가질 수 있지만, 정적으로 할당 된 변수는 모두 초기화 되어야만 프로그램 시작 속도가 느려집니다. 아마 눈치 채기에 충분하지 않을 것입니다. Fred가 말했듯이, 많은 전역 변수를 사용하면 프로그램을 유지 관리하기가 어려워 지므로 권장하지 않습니다. extern linkage가없는 file-scoped 변수가 더 좋을 것입니다. 이것은 C++의 이름없는 네임 스페이스 또는 C의 static 키워드 (C++에서는 권장하지 않음)를 사용하여 수행 할 수 있으며 전역 변수처럼 쉽게 스파게티 코드를 생성하지는 않습니다. –

1

주요 요점은 변수의 유효 기간을 정의하는 변수의 범위입니다. main의 변수 outsie는 프로그램 기간 동안 사용할 수 있습니다. main 내부 변수는 main() 함수의 지속 시간 동안 사용할 수 있습니다.

사실 함수 범위 변수는 스택에 할당되지만 전역 변수는 힙에 할당되지만 구현 세부 사항입니다.

전역 변수의 주된 문제점은 액세스 제어이며, 다중 스레드 프로그램에서 작업하기가 어려울 수 있습니다.

EDIT : @FredOverflow가 아래에서 지적한 것처럼, 일반적으로 전역은 실행 가능 이미지가로드 될 때 설정되는 데이터 영역에 할당됩니다.

+0

전역 변수가 힙에서 할당되지 않았지만 데이터 세그먼트 또는 다른 것으로부터 할당 된 것입니다. – fredoverflow

+0

@Fred - 네 말이 맞아. 내 생각이 내 타이핑을 따라 가지 못했다. ! – mdma

3

일반적으로 a, b, c, d *는 프로그램 스택에 정의되지만 C++ ISO 표준은 변수를 정의해야하는 위치를 지정하지 않습니다.

두 번째 질문에 대해 전역 변수의 문제는 보호 기능이 없다는 것입니다.전역 변수에 의존하는 간단한 스크립트/애플리케이션의 경우에는 괜찮을 지 모르지만 라이브러리에서는 더 복잡한 코드를 사용하면 잠재적 인 문제가 발생할 수 있습니다. 모든 코드는 언제든지 전역 범위를 사용하여 변수 값을 변경할 수 있으므로 전역 변수에 의존하는 코드는 바람직하지 않은 상태.

또한 변수가 전역 범위에 있으므로 동일한 이름의 전역 변수를 정의하는 다른 코드를 사용하면 잠재적 인 명명 충돌이 발생할 수 있습니다.

관련 문제