C++에서 저장소 클래스 지정자는 데이터 영역에서 메모리를 할당합니다. "데이터 영역"은 무엇을 의미합니까?데이터 영역이란 무엇입니까?
답변
Konrad가 말한 것에 덧붙여, 변수를 정적으로 선언한다는 것은 기본적으로 힙이나 스택이 아니라로드 된 프로그램에 할당 된 메모리를 의미합니다. 역사적으로 중요한 응용 프로그램에서 정적 변수 만 사용하면 응용 프로그램의 메모리 사용 공간이 런타임에 변경되지 않으므로 리소스 제한으로 인해 실패 할 확률이 줄어 듭니다. 현대 운영 체제에서 이것이 여전히 사실인지 모릅니다.
출력의 일부로 컴파일러에서 mapfile을 생성하게되면 데이터를 포함하여 다양한 섹션에있는 내용을 볼 수 있습니다.
저는 "데이터 영역"이라는 용어에 익숙하지 않지만 메모리는 종종 "코드 섹션"과 "데이터 섹션"으로 나뉩니다. 코드는 전자에 있고 코드는 전자에 있습니다. 이것이 여기서 의미하는 바입니다.
전통적으로이 둘 사이의 구별은 없습니다. 그러나 많은 최신 운영 체제는 데이터 세그먼트에서 코드 실행을 금지 할 수 있습니다 (CPU가 이러한 구분을 지원하는 경우). 이것은 "실행되지 않음"에서와 같이 "NX 플래그"의 캐치 프레이즈에 의해 때때로 악성 코드 삽입의 일부 사례를 효과적으로 방지 할 수 있습니다.
/EDIT : C++ 표준은 "데이터 영역"을 언급하지 않습니다.
콘라드가 말한 바.
코드 섹션에 배치 된 경우 데이터를 읽을 수없는 CPU가 여전히 있으며 그 반대도 마찬가지라고 덧붙이고 싶습니다. 이들은 수십 년 전부터 보편적 이었지만 임베디드 세계에서 여전히 살아 있습니다.
간단히 말해 링커는 같은 종류의 심볼을 그룹화합니다. PC에는 간단한 코드 및 데이터 영역 이상이 있습니다. 초기화되지 않은 데이터, 읽기 전용 데이터 및 기타 OS 종속적 인 영역도 찾을 수 있습니다. 작은 인터넷 검색으로
내가 여기에이 주제에 대한 자세한 내용을 발견 :
가 나는 반면, 지역 변수는 보통 것 '데이터 영역', 힙에 참조 생각 스택에 위치해야합니다.
또는이 변수에 할당 된 메모리는 실행 파일의 .data 섹션에 있지만 Windows 및 PE 형식에만 해당됩니다.
데이터가 많은 장소가 있습니다. 일반적으로 지역 변수는 스택에 할당되며 malloc (또는 기본 버전 'new')을 사용하여 힙에 할당 할 수 있습니다. 그러나 정적 데이터는 일반적으로 프로그램이 시작될 때 할당되며 어디서나 끝날 수 있습니다. 정확히 컴파일러, OS 및 실행 파일 형식이 될 수 있습니다.
플랫폼, 컴파일러 및 링커에 따라 영역 이름이 다릅니다. 일반적으로
이있다 :
- 프로그램 텍스트 : 실행 가능한 코드 공간.
- 상수 : 실행 불가능한 상수.
- 스택 : 스택.
- bss : C/C++ 용어로 광범위하게 "statics". "블록 시작 심볼"
- 데이터 : 초기화되지 않은 전역
- 힙 : 런타임에 할당 된 저장소.
이 경우 해당 문서는 전통적으로 bss 세그먼트라고하는 이름에 대해 "데이터 영역"이라는 이름을 사용하고 있습니다.
C라는 용어에서 저장 클래스 지정자 "정적"은 프로그램의 수명 동안 존재하며 초기화 자의 0 또는 값으로 초기화되는 메모리를 의미합니다. 이 예에서 :
static int s_value_one;
static int s_value_two = 123;
는 s_value_one의 값은 제로로 보장 s_value_type의 값은 메인에 처음 문장의 시점 (123)()이다. 이것이 실현되는 방법은 구현 문제입니다.
실행 파일에는 많은 정보가 있습니다.
실행 파일은 실제 파일 안에 많은 유형/클래스의 데이터가 저장되어 있습니다.
예를 들어 년대는
- 실행 코드 명령어입니다
- 종속성 정보 (이 바이너리를 DLL에 대한 의존)
- 자원 이 진
등에서 내 보낸
구성 할 수있는 방법이 필요합니다.
이 정보는 .exe 파일 형식으로되어있어 OS가 모든 정보를 쉽게 찾고 실행 파일을로드하고 작동하도록 할 수 있습니다. 이 목적을 위해 PE (Portable Executable)라고 불리는 공통 바이너리 형식 (M $ of-course로 생성)이 Windows 환경에서 사용됩니다. 방금 나열한 모든 정보 (및 기타 정보)는 이진의 다른 섹션에서 자세히 설명합니다.
.DATA 부
이러한 하나의 부분은 데이터 섹션이다. .data 섹션에는 초기화 된 전역 및 정적 데이터가 모두 들어 있고, .bss 섹션에는 초기화되지 않은 전역 데이터가 들어 있습니다.
왜 전역에 대해 별도의 섹션이 필요합니까?
글쎄, 글로벌은 프로그램의 수명 동안 존재하는 메모리 영역에 생성되고 덮어 쓰거나 재사용 될 수있는 스택과 같은 임시 데이터 구조가 아니기 때문에 전역처럼 작동합니다. (일반적인 자동 변수와 마찬가지).
컴파일러 따라서 이러한 변수는 불행하게도 컴파일 타임에 할 수없는 힙, 약간의 영구적 인 주소를 할당 할 필요가있다. 따라서 컴파일러는이 전역 변수와 정적 변수를이 .data/.bss 섹션에 배치하고 이러한 변수를 참조하는 지침은 .data/.bss의 상대적으로 영구적 인 주소를 참조합니다.
은 링커 링커가 현실 세계에서 실행 파일을로드
, 그것은 이러한 섹션이 배치되어야 할 곳을 결정하고 전역을 참조하는 지침을 참조하도록 이러한 임시 주소를 FIX 업을 생성 이제 프로그램 메모리의 실제 가상 주소
이제는 .data 섹션/영역이 무엇인지, 왜 전역에 해당 영역에 약간의 공간이 할당되어야하는지, 그리고 어떻게 실시간으로 프로그램에 도움이되는지 알 수 있습니다. 인터넷 검색 형식과 링커 및. 데이터 섹션 등 당신에게 링크를 얻을 것이다.
일반적으로 코드 섹션은 코드 세그먼트 레지스터 (CS)와 데이터 세그먼트 레지스터 (DS)를 통해로드/참조된다는 점이 다릅니다 (x86 기반 프로세서 이상). 플랫 메모리 모델에서는 NX를 제외하고는 아무런 차이가 없습니다. – Zooba