문제

C ++에서 스토리지 클래스 지정자 정적은 데이터 영역에서 메모리를 할당합니다. "데이터 영역"은 무엇을 의미합니까?

도움이 되었습니까?

해결책

Konrad가 말한 것 외에도, 변수를 정적으로 선언한다는 것은 기본적으로 기본적으로 메모리가 힙 또는 스택에 대조적으로로드 될 때 프로그램에 할당된다는 것을 의미합니다. 역사적으로, 중요한 응용 프로그램에서 정적 변수 만 사용하면 응용 프로그램의 메모리 풋 프린트가 런타임에 변경되지 않으므로 리소스 제한으로 인해 실패 할 가능성이 적습니다. 이것이 현대 운영 체제에서도 여전히 사실인지 모르겠습니다.

컴파일러가 출력의 일부로 Mapfile을 생성하도록하는 경우 데이터를 포함한 모든 다양한 섹션의 내용을 볼 수 있습니다.

다른 팁

나는 "데이터 영역"이라는 용어에 익숙하지 않지만 메모리는 종종 "코드 섹션"과 "데이터 섹션"으로 나뉩니다. 코드는 후자의 데이터에 있습니다. 나는 이것이 여기서 의미하는 바라고 생각한다.

고전적으로, 둘 사이에는 차이가 없습니다. 그러나 많은 현대 운영 체제는 HE 데이터 세그먼트의 코드 실행을 금지 할 수 있습니다 (CPU 가이 차이를 지원하는 경우). 이것은 때때로“실행 없음”에서와 같이 "NX 플래그"의 캐치 프레이즈로 이동하며 악의적 인 코드 주입의 경우 효과적으로 예방할 수 있습니다.

/편집 : C ++ 표준은 "데이터 영역"을 언급하지 않습니다.

영역의 이름은 플랫폼, 컴파일러 및 링커에 따라 다릅니다.

일반적으로 다음이 있습니다.

  • 프로그램 텍스트 : 실행 가능한 코드 공간.
  • 상수 : 실행 불가능한 상수.
  • 스택 : 스택.
  • BSS : C/C ++ 용어로 광범위하게 "Statics". "블록이 상징으로 시작되었습니다"
  • 데이터 : 발고되지 않은 글로벌
  • 힙 : 런타임에 스토리지가 할당되었습니다.

이 경우 문제의 문서는 전통적으로 BSS 세그먼트라고 불리는 "데이터 영역"이라는 이름을 사용합니다.

C 용어로, 스토리지 클래스 지정자 "정적"은 프로그램의 수명에 존재하는 메모리를 의미하며 이니셜 라이저의 0 또는 값으로 초기화됩니다. 예에서 :

static int s_value_one;
static int s_value_two = 123;

s_value_one의 값은 0으로 보장되고 s_value_type의 값은 main ()의 첫 번째 문의 지점에서 123입니다. 이것이 사실이되는 방법은 구현 문제입니다.

Konrad가 말한 것.

코드 섹션에 배치 된 경우 데이터를 읽을 수없는 CPU가 여전히 남아 있다고 덧붙이고 싶습니다. 이들은 수십 년 전에 더 흔한 일 이었지만 여전히 내장 된 세상에서 살아 있습니다.

간단히 말해서 링커는 동일한 종류의 상징을 그룹화합니다. PC에서는 종종 간단한 코드와 데이터 영역 이상의 것이 있습니다. 초기화되지 않은 데이터의 영역을 찾을 수 있으며, 데이터 만 읽고 다른 OS 의존성을 읽을 수 있습니다.

작은 인터넷 검색 으로이 주제에 대한 자세한 정보는 다음과 같습니다.

데이터가 끝날 수있는 곳이 많이 있습니다. 일반적으로 로컬 변수는 스택에 할당되며 Malloc (또는 DE 기본 버전의 'New')을 사용하여 힙에 물건을 할당 할 수 있습니다. 그러나 정적 데이터는 일반적으로 프로그램이 시작될 때 할당되며 컴파일러, OS 및 실행 가능한 형식에 정확히 달리는 곳에서는 어디에서나 할 수 있습니다.

실행 파일에는 많은 정보가 있습니다.

실행 파일에는 물리적 파일 내에 저장된 많은 유형 / 클래스의 데이터가 있습니다.

예를 들어

  1. 실행 가능한 코드 지침
  2. 자원
  3. 종속성 정보 (이 바이너리 DLL은
  4. 이 바이너리에서 내보낸 기호

정리할 수있는 방법이 필요합니다

OS가 모든 정보를 쉽게 찾아 실행 파일을로드하고 작동 할 수 있도록 .Exe 파일 형식 내부 의이 모든 정보. 이를 위해 PE (휴대용 실행 파일)라는 공통 바이너리 형식 (M $의 코스에 의해 생성)이 Windows 세계에서 사용됩니다. 방금 나열된 모든 정보 (그리고 더 많은 정보)는 이진의 다른 섹션에 자세히 설명되어 있습니다.

.Data 섹션

그러한 섹션 중 하나는 .data 섹션입니다. .Data 섹션에는 초기화 된 모든 글로벌 및 정적 데이터가 포함되어 있으며 .BSS 섹션에는 초기화되지 않은 글로벌 데이터가 포함되어 있습니다.

글로벌에 대해 별도의 섹션이 필요한 이유는 무엇입니까?

글쎄, 글로벌은 프로그램의 수명 동안 존재하는 메모리 영역에서 생성되며 덮어 쓰기 / 재사용 될 수있는 스택과 같은 임시 데이터 구조가 아니기 때문에 글로벌처럼 행동합니다. (일반 자동 변수와 유사).

컴파일러

따라서 이러한 변수는 힙의 일부 영구 주소로 할당되어야하며, 불행히도 편집 시점에는 알 수 없습니다. 따라서 컴파일러는이 .Data / .BSS 섹션에 모든 전역 및 정적 변수를 배치하고 이러한 변수를 참조하는 지침은 .Data / .BSS의 비교적 영구 주소를 나타냅니다.

링커

링커가 현실 세계에서 실행 파일을로드 할 때,이 섹션을 배치 해야하는 위치를 결정하고 이러한 온도 주소에 대한 수정을 생성하여 글로벌을 참조하는 지침이 프로그램 메모리의 실제 가상 주소를 참조하도록합니다.

이제 .data 섹션 / 면적이 무엇인지, 왜 그 지역의 일부 공간을 할당 해야하는지, 그리고 그것이 프로그램을 실시간으로 돕는 방법을 알고 있습니다. Googling PE 형식 및 링커 및 .Data 섹션 등은 링크를 얻을 수 있습니다.

나는 '데이터 영역'이 힙을 언급하는 반면, 로컬 변수는 일반적으로 스택에 위치 할 것이라고 생각합니다.

또는이 변수에 할당 된 메모리가 실행 파일의 .Data 섹션에 있지만 Windows 및 PE 형식에만 해당됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top