메모리 지정자는 크게 기억 부류 지정자, 타입 지정자, 타입 한정자로 나뉜다
메모리 지정자는 할당받을 메모리의 크기만 결정하는 것이 아니라 메모리의 성질과 유효 범위, 유효 시간 등을 결정한다
질문 -> 지역 변수는 초기화하지 않으면 쓰레기 값인데, 전역 변수는 왜 0이죠?
답 -> 지역변수는 스택, 전역 변수는 데이터 세그먼트(or bss)
초기화되는 전역 변수와 정적 변수(static 인듯) -> data segment
초기화되지 않는 전역 변수와 정적 변수 -> bss segment
지역 변수와 함수 인자 -> stack
레지스터 변수 -> register
문자열과 상수 -> text segment
기억 부류 지정자 - extern, static, auto, register
이 지정자들에 의해서 데이터가 저장될 메모리의 영역이 결정됨
결정된 메모리의 역영에 따라서 데이터의 초기화나 유효 범위, 유효 시간 등이 달라진다.
타입 지정자 - void, char, short, int, long, float, double, signed, unsigned
타입 한정자 - const, volatile (메모리의 성질 변화를 일으키는 한정자?)
static
초기화를 하면 data segment에 저장되고 초기화를 안하면 값이 0으로 bss segment에 저장됨 전역변수는 extern 키워드를 이용해 외부 파일에서 접근이 가능하지만 static의 경우 extern으로 접근이 불가능함. 왜 이걸 쓰나? 전역같은 지역변수를 쓸때 사용 지역변수의 리턴값
int* func(int x) { int sum; sum = x * x; return ∑
이 경우 함수를 실행하고 리턴하고 나서 접근해보면 지역변수가 실행되고 난 뒤이기 때문에 스택의 값이 바뀌어있을수도 있고 아마 쓰레기값이 되어있을듯 sum을 static으로 선언하면 스택이 아닌곳에 저장됨... 이거 머가좋나? 전역으로 하면 좋긴 한데...이렇게 하면 같은 이름의 변수명을 여러개 써도 가능하고 scope의 차이가 암튼 편리함을 만들어 주는듯. 동적할당 안해도 되고 코딩하기엔 편하겠지 |
extern
extern 키워드는 2가지 의미가 있다. 하나는 전역 변수를 의미하는 키워드, 또 하나는 다른 모듈의 전역 변수를 끌어다 쓰겠다는 의미이다. 첫 번째는 보통 생략하는데, 지역 변수를 선언할 때 auto 키워드를 생략하는 것과 같은 맥락이다. 지정자를 생략해도 지역 변수와 전역 변수는 선언문이 함수의 외부 또는 내부에 있는가에 따라서 구분하기 때문에 별 문제가 없다. |
auto
자동 변수 또는 지역 변수라고 하며, 스택에 저장된다....이거 필요성을 못느끼겠네
#include <stdio.h> int main(void)
이렇게 하면 i = 255 이렇게 계속 출력됨
|
register
레지스터 변수는 말 그대로 레지스터에 저장되는 변수이며, 저장되는 메모리만 다를 뿐 작동은 지역 변수와 비슷하다. register 키워드를 붙였다고 해서 레지스터에 저장된다는 보장은 없다. 현재 레지스터의 사용량에 따라 공간이 있을 때에만 할당된다. 만약 빈 레지스터가 없다면, 스택에 저장된다. 성능을 높일 수 있다.
초기화 안하면 쓰레기 값 , 선언된 함수가 실행될 때부터 종료될 때까지 life time(지역 변수와 같음) |
'컴퓨터 과학 & 영상처리 관련 > 임베디드' 카테고리의 다른 글
집합원소 저장의 효율적 방법 (0) | 2012.06.04 |
---|---|
변수를 잘 사용하는 건 최적화의 기본 (0) | 2012.06.03 |
gcc 컴파일 설정 (0) | 2012.05.29 |
ARM과 인텔의 경우 arg갯수에 따라 load/store 명령을 하기도함 (0) | 2012.05.27 |
리눅스에서의 main() 호출과정 / no_OS의 경우의 main() 호출과정 (0) | 2012.05.24 |