로컬, 전역, 정적, 자동, 레지스터, 외부, 상수 및 휘발성 변수는 어디에 저장됩니까?
로컬, 전역, 정적, 자동, 레지스터, 외부, 상수 및 휘발성 변수는 어디에 저장됩니까?
로컬 변수는 자동인지 정적인지에 따라 스택에 저장하거나 데이터 세그먼트에 저장할 수 있습니다.(자동 또는 정적 중 어느 것도 명시적으로 지정되지 않은 경우 자동으로 가정됨)
전역 변수는 (컴파일러가 최적화할 수 없는 한) 데이터 세그먼트에 저장되며, 선언 시점부터 컴파일 단위의 끝까지 가시성을 갖습니다.
정적 변수는 데이터 세그먼트에 저장되며(컴파일러가 최적화할 수 없는 한) 선언 시점부터 엔클로저 스코프의 끝까지 가시성을 갖습니다.정적이 아닌 전역 변수는 다른 컴파일 단위에서도 볼 수 있습니다(외부 참조).
auto 변수는 항상 로컬 변수이며 스택에 저장됩니다.
레지스터 수정자는 컴파일러에게 가능하다면 변수를 레지스터에 유지하기 위해 최선을 다하라고 말합니다.그렇지 않으면 스택에 저장됩니다.
외부 변수는 데이터 세그먼트에 저장됩니다.외부 수정자는 컴파일러에게 다른 컴파일 단위가 실제로 변수를 선언하고 있으므로 다른 인스턴스를 만들지 마십시오. 그렇지 않으면 링크 시 이름 충돌이 발생합니다.
const 변수는 자동인지 정적인지에 따라 스택 또는 읽기 전용 데이터 세그먼트에 저장할 수 있습니다.그러나 컴파일러가 다른 컴파일 단위에서 참조할 수 없거나 코드가 const 변수의 주소를 사용하고 있지 않다고 판단할 수 있는 경우에는 해당 코드를 자유롭게 최적화할 수 있습니다(각 참조는 constant 값으로 대체할 수 있음).그런 경우에는 어디에도 보관되어 있지 않습니다.
volatile modifier는 컴파일러에게 변수의 값이 외부의 영향(일반적으로 하드웨어)으로부터 언제든지 변할 수 있음을 알려주기 때문에 해당 변수가 참조될 때 메모리에서 레지스터로 다시 로드되는 것을 최적화하려고 해서는 것입니다.이는 정적 스토리지를 의미합니다.
그건 그렇고 이 모든 것은 목표-C 뿐만 아니라 C&C++에도 적용됩니다.
어느 수준의 추상화에서 답을 찾고 계십니까?
물리적 수준에서는 게이트 용량과 자기 영역에 모두 저장되어 있을 것들에 저장되어 있을 것입니다.(스왑 디스크가 Wi-Fi 또는 광섬유가 연결되어 있는 경우에는 광자도 사용할 수 있습니다.)
한 하드웨어 레벨에서는 레지스터, 데이터 캐시(아마도 여러 레벨), 메인 메모리 및/또는 스토리지 계층의 여러 위치에 이러한 변수의 복사본이 존재할 수 있습니다. 모든 요구 페이지의 존재, 구현 및 현재 상태에 따라 완전히 Disk 또는 비휘발성 메모리 스토리지로 스왑되는 것부터 시작합니다.d 가상 메모리 서브시스템), 애플리케이션의 크기와 수명이 충분히 작다면 아마도 레지스터의 모든 것에 적용할 수 있습니다.
가장 익숙한 컴파일러와 런타임 구현을 고려할 때, 메모리(아마도 가상)는 스택과 힙이라고 불리는 것으로 나뉩니다.공식 언어 정의를 고려할 때 이 잘라내기가 필요할 수도 있고 필요하지 않을 수도 있습니다.
컴파일러 최적화 수준에서 이러한 변수 중 많은 것이 존재하지 않는 상태에서 최적화되었을 수 있습니다.추상화된 것 말고는 어디에도 저장되지 않습니다.
및 auto변수는 스택에 저장됩니다.글로벌과static변수는 DATA 페이지에 저장됩니다.register변수는 가능하면 CPU의 레지스터에 저장되고, 그렇지 않으면 스택에 저장됩니다.extern,const,그리고.volatile변수가 저장된 위치를 지정하지 마십시오. 변수는 다른 저장 지정자가 말하는 위치에 저장됩니다.
로컬 변수는 보통 스택에 저장되고 전역 변수는 프로그램의 "텍스트" 세그먼트( 문자열 상수의 경우) 또는 동적으로 할당된 경우 힙에 저장됩니다.자동 변수는 일반적으로 함수/메소드에 사용되며 일반적으로 스택에 전달됩니다(아키텍처에 따라 레지스터에도 전달되는 경우가 있음).레지스터 변수는 한때 레지스터에 저장되었지만, 요즘 대부분의 컴파일러는 레지스터 키워드를 무시하고 적합하다고 판단되는 곳 즉 스택이나 레지스터에 저장합니다.외부, 상수 및 휘발성 부재는 수식어이므로 저장된 위치가 확실하지 않습니다.
그래서 짧은 대답은, 평소처럼, "다름"입니다.
현지의
범위가 함수 내에 있는 로컬 변수입니다.자동 또는 정적 두 가지 유형일 수 있습니다.
단순히 intvar로 선언된 경우 컴파일러는 자동 저장 클래스로 취급합니다.자동 변수는 스택에 저장됩니다.
정적 변수는 데이터 세그먼트에 저장됩니다.
레지스터 변수는 CPU에 저장됩니다. 변수를 저장할 수 있는 레지스터가 없으면 컴파일러는 자동 변수로 취급합니다.
전역 변수는 데이터 세그먼트 영역에 저장됩니다.
const 변수는 읽기 전용 영역에 저장됩니다.그것은 메모리의 코드 세그먼트 영역입니다.
언급URL : https://stackoverflow.com/questions/3684760/where-are-the-local-global-static-auto-register-extern-const-and-volatile
'programing' 카테고리의 다른 글
| 도커 컴포지트.yml에서 도커 컨테이너를 리빌드하는 방법은? (0) | 2023.10.26 |
|---|---|
| DDD(Data Display Debugger)의 좋은 유닉스 대안은 무엇입니까? (0) | 2023.10.21 |
| Google Chrome form autofill 및 노란색 배경 (0) | 2023.10.21 |
| 마리아드브 갈레라 성단과 캡 정리 (0) | 2023.10.21 |
| 자바스크립트는 어떻게 블롭을 업로드 할 수 있습니까? (0) | 2023.10.21 |