C++ 전체 참조에서 언급했듯이 상수 데이터는 ROM에 저장됩니다. 그러나 지역 변수는 RAM에있는 스택 내부에 저장됩니다. 따라서 로컬 상수 데이터를 선언하면 저장됩니다. RAM 또는 ROM?C++의 상수 데이터를위한 메모리 저장
답변
가능한 유일한 대답은 "입니다. 이는"입니다.
C++는 하드웨어 위에있는 추상화 수준이며 운영 체제와 같은 다른 소프트웨어에서 "hosted"이 될 수있는 코드를 생성합니다.
하드웨어를 사용하는 방식은 하드웨어 자체가 무엇인지, 작동하고 관리되는지, 그리고 컴파일러 디자이너가 이러한 모든 기능을 사용하려고했는지에 따라 다릅니다.
상수와 변수의 차이점은 변수가 (언어 디자이너가) 수정하고 값을 유지하도록 설계되었으며 상수는 수정되지 않도록 설계되었습니다.
C++에서 상수에 대해 말하는 유일한 것은 "정의되지 않은 동작"을 발생시키는 것입니다. 즉, "언어 디자이너가 어떤 일이 발생할 수 있는지 (또는 발생하지 않을 것임을) 말하지 않습니다"입니다.
컴파일러 디자이너는 작업하는 플랫폼과 호환 할 수있는 작업을 수행합니다. 일부 상수는 실제 ROM에 저장되고 (마이크로 컨트롤러로 생각), 일부는 RAM에 "쓰기 액세스가 거부되었습니다"(하드웨어 트랩이 수정되면 생성됩니다. OS에 따라 달라집니다. 일반적으로 트랩은 다음과 같습니다. 언어에 의해 지원 될 수도 있고 지원되지 않을 수도있는 OS 예외로 번역 될 수있다.) 단순히 그러한 RAM 코드가 존재하지 않는 RAM에서, 일부는 머신 코드 명령 자체 내에 존재한다.
하드웨어를 직접 프로그래밍하지 않는 한 어떤 경우에도이 세부 정보는 신경 쓰지 않아도됩니다. "상수는 ROM에 들어갈 수 있습니다"라는 말은 사실 일 수 있지만 (플랫폼이 허용하는 경우) "상수는 ROM에 저장됩니다"는 단순한 거짓말입니다.
"ROM"이라는 용어는 일반적으로 물리적으로 쓰기가 불가능한 하드웨어를 위해 예약되어 있습니다. 상수는 여전히 물리적으로 "RAM"에 배치됩니다 (그렇지 않으면 프로그램이 어떻게로드 될 수 있습니까?)
기술적으로 사양 작성에 대한 보호는 거의 없습니다 ... 그렇게 할 경우 단지 undefined behavior입니다.
물건이 저장되는 곳에는 현재 아키텍처에 대한 몇 가지 일반적인 사례가 있습니다. 그러나 컴파일러는 자유롭게 자체 결정을 내릴 수 있습니다. 예를 들어,이 참조 : 런타임에 스택에 저장
현지 일정 데이터를. 정적 로컬 및 전역 데이터는 일반적으로 컴파일 타임에 읽기 전용 세그먼트에 저장됩니다. 그러나 컴파일러는 일부 최적화를 수행하고 로컬 상수도 읽기 전용 세그먼트에 저장할 수 있습니다.
RAM 또는 ROM이 아닙니다. 데이터 세그먼트와 읽기 전용 세그먼트 여야합니다. – Matt
이것은 ** 구현 정의 **입니다. 정확히 어디에 저장되어 있는지 걱정할 필요가 없습니다. 이해해야 할 것은 const의 정확성 계약이며 엄격하게 준수해야합니다. –
contant 변수가 결코 datasegment 안에 저장되지 않을 것이라는 것을 알고 있습니다. 내가 틀렸다면 수정하십시오. – Kenta