상수 변수는 C의 어디에 저장됩니까?
상수변수가 어디에 저장되어 있는지 궁금합니다.글로벌 변수와 동일한 메모리 영역에 있습니까?아니면 스택에 있나요?
어떻게 저장되는지는 구현 세부 사항입니다(컴파일러에 따라 다름).
예를 들어 GCC 컴파일러에서는 대부분의 머신에서 읽기 전용 변수, 상수 및 점프 테이블이 텍스트 섹션에 배치됩니다.
특정 프로세서가 수행하는 데이터 세그먼트화에 따라 5개의 세그먼트가 있습니다.
- 코드 세그먼트 - 코드, ROM만 저장합니다.
BSS(또는 기호로 시작하는 블록) 데이터 세그먼트 - 초기화된 전역 및 정적 변수를 저장합니다.- 스택 세그먼트 - 모든 로컬 변수 및 함수 반환 주소 등에 대한 기타 정보를 저장합니다.
- 힙 세그먼트 - 모든 동적 할당이 여기에서 수행됩니다.
- Data BSS(또는 기호로 시작된 블록) 세그먼트 - 초기화되지 않은 전역 변수 및 정적 변수를
저장합니다.
데이터와 BSS 세그먼트의 차이는 전자는 초기화된 글로벌 변수와 정적 변수를 저장하고 후자는 UN 초기화된 변수를 저장하는 것입니다.
상수 변수가 어디에 저장되어 있는지 알려줘야 하는데 왜 데이터 분할을 말하는 걸까요?거기에는 이유가 있다...
모든 세그먼트에는 모든 상수가 저장되는 쓰기 보호 영역이 있습니다.
예를 들어 다음과 같습니다.
- 로컬 변수인 const int가 있는 경우 스택세그먼트의 쓰기 보호 영역에 저장됩니다.
- const var로 초기화되어 있는 글로벌이 있는 경우 데이터 세그먼트에 저장됩니다.
- 초기화되지 않은 Const var가 있는 경우 BSS 세그먼트에 저장됩니다.
요약하자면, "const"는 데이터 한정자일 뿐입니다. 즉, 컴파일러는 먼저 변수를 저장해야 하는 세그먼트를 결정하고 변수가 상수일 경우 해당 세그먼트의 쓰기 보호 영역에 저장될 수 있습니다.
이것은, Win32 시스템 전용입니다.
컴파일러에 의존하지만, 완전히 저장되지 않을 수도 있습니다.컴파일러는 그것을 최적화하고 그것을 사용하는 식에 그 가치를 직접 더하기만 하면 되기 때문입니다.
프로그램에 이 코드를 추가하고 팔피질 m4를 gcc로 컴파일하여 메모리 사용량의 차이를 확인합니다.
const 없음:
int someConst[1000] = {0};
const:
const int someConst[1000] = {0};
컴파일러, 시스템 기능, 컴파일 중 구성에 따라 달라집니다.
gcc
에 읽기 전용 상수를 배치합니다..text
★★★★★★★★★★★★★★★★★★」
일반적으로 읽기 전용 데이터 섹션에 저장되지만 글로벌 변수 섹션에는 쓰기 권한이 있습니다.따라서 주소를 취득하여 상수를 변경하려고 하면 segfault라고 불리는 액세스 위반이 발생할 수 있습니다.
그러나 하드웨어, OS 및 컴파일러에 따라 달라집니다.
코드를 고려합니다.
const int i = 0;
static const int k = 99;
int function(void)
{
const int j = 37;
totherfunc(&j);
totherfunc(&i);
//totherfunc(&k);
return(j+3);
}
「일부러」i
텍스트 세그먼트에 저장할 수 있습니다(고정값을 가진 읽기 전용 변수).텍스트 세그먼트에 없는 경우 전역 변수 옆에 저장됩니다.이 값이 0으로 초기화된 경우, 이 값은 'bss' 섹션(일반적으로 0으로 설정된 변수가 할당됨) 또는 'data' 섹션(일반적으로 초기화된 변수가 할당됨)에 있을 수 있습니다.
가 "Drught"를 k
는 미사용입니다(단일 파일에 로컬이기 때문에 미사용일 수 있습니다).오브젝트 코드에 전혀 표시되지 않을 수 있습니다.의 .totherfunc()
를 참조하고 있습니다.k
, 그 후술하다.k
되어 있어야 합니다. 같은 입니다.이치노i
.
상수(상수인 경우에도 변수입니까?) j
(comp.d.c)는 아닙니다.는는행 SOd comp.std.c !)) 。
변수를 참조로 전달했기 때문에 강제로 표시했다는 점에 유의하십시오(아마도 상수 정수에 대한 포인터가 필요한 함수).되지 않은 는, 「수신 불가」로 .j
★★★★★★★★★★★★★★★★★」k
이치노i
컴파일러는 프로그램 전체의 모든 소스 코드를 알아야 합니다.다른 번역 유닛(소스 파일)에서는 액세스 할 수 있기 때문에 쉽게 삭제할 수 없습니다.프로그램이 공유 라이브러리의 동적 로드에 몰두하는 경우에는 두 번이 아닙니다. - 이러한 라이브러리 중 하나는 글로벌 변수에 의존할 수 있습니다.
(스타일적으로 - 변수i
그리고.j
는 더 길고 의미 있는 이름을 가져야 합니다.이것은 예에 불과합니다).
물론 아니다, 왜냐하면
1) bss 세그먼트에 미개척 변수가 저장되어 있습니다.분명히 다른 유형이 있습니다.
(I) large static and global and non constants and non initilaized variables it stored .BSS section.
(II) second thing small static and global variables and non constants and non initilaized variables stored in .SBSS section this included in .BSS segment.
2) 데이터 세그먼트는 3가지 타입을 가진 초기화 변수입니다.
(I) large static and global and initlaized and non constants variables its stord in .DATA section.
(II) small static and global and non constant and initilaized variables its stord in .SDATA1 sectiion.
(III) small static and global and constant and initilaized OR non initilaized variables its stord in .SDATA2 sectiion.
위에서 설명한 small and large는 컴파일러의 디퍼트를 의미합니다.예를 들어 small은 <8바이트 미만, large는 8바이트 이하의 값입니다.
하지만, 국지적인 상수가, 그것이 성큼성큼 다가오고 있는 것은 아닐까 하는 의문이 든다.
이는 대부분 전문적인 추측이지만, 일반적으로 상수는 컴파일된 프로그램의 실제 CPU 명령에 즉시 데이터로 저장됩니다.즉, 대부분의 명령에는 데이터를 가져올 주소의 공간이 포함되어 있지만, 상수일 경우 공간 자체가 값을 유지할 수 있습니다.
global 키워드와 constant 키워드는 완전히 구분되어 있습니다.둘 중 하나를 가질 수도 있고 둘 다 가질 수도 있습니다.
따라서 변수가 메모리에 저장되는 위치는 구성에 따라 달라집니다.힙과 스택에 대해 조금 더 자세히 읽어보십시오. 그러면 더 많은 질문을 할 수 있는 지식을 얻을 수 있습니다.
전혀 저장되지 않을 수 있습니다.
다음과 같은 코드를 생각해 보십시오.
#import<math.h>//import PI
double toRadian(int degree){
return degree*PI*2/360.0;
}
이를 통해 프로그래머는 무슨 일이 일어나고 있는지에 대한 아이디어를 수집할 수 있지만 컴파일러는 컴파일 시 일정한 식을 평가함으로써 그 중 일부를 최적화할 수 있으며 대부분의 컴파일러는 이를 통해 결과 프로그램에는 값 PI가 전혀 존재하지 않을 수 있습니다.
애드온과 마찬가지로 링크 프로세스 중에 최종 실행 파일 중 메모리 레이아웃이 결정됩니다.다른 입력 파일의 공통 기호를 배치하는 COMMON이라는 섹션이 하나 더 있습니다.이 공통 섹션은 실제로 .bss 섹션에 속합니다.
일부 상수는 저장조차 되지 않습니다.
다음 코드를 고려합니다.
int x = foo();
x *= 2;
컴파일러가 곱셈을 다음과 같이 변환할 가능성이 있습니다.x = x+x;
메모리로부터 숫자 2를 로드할 필요가 적어지기 때문입니다.
x86_64 GNU/Linux 시스템에서 확인했습니다.'const' 변수에 대한 포인터를 참조하지 않으면 값을 변경할 수 있습니다.나는 objdump를 썼다.텍스트 세그먼트에서 'const' 변수를 찾을 수 없습니다.'const' 변수는 스택에 저장됩니다.const는 C의 컴파일러 명령어입니다.컴파일러는 'const' 변수를 변경하는 문을 발견하면 오류를 발생시킵니다.
언급URL : https://stackoverflow.com/questions/1576489/where-are-constant-variables-stored-in-c
'itsource' 카테고리의 다른 글
Vuex 모듈 작업에서 vue-router를 사용하는 방법 (0) | 2022.08.27 |
---|---|
.o, .a 및 .so 파일의 차이점은 무엇입니까? (0) | 2022.08.21 |
Vue - 래퍼 구성 요소의 프로펠을 재정의하는 방법 (0) | 2022.08.21 |
Spring 3.0 - XML 스키마 네임스페이스용 Spring NamespaceHandler를 찾을 수 없습니다[ http://www.springframework.org/schema/security ] (0) | 2022.08.21 |
word2vec bin 파일을 텍스트로 변환 (0) | 2022.08.21 |