메모리와 포인터6 : 변수와 메모리
변수의 본질은 메모리. 주 기억장치 메모리
가용한 메모리는
- 스택
- 힙
- 텍스트
- 데이터
영역의 메모리.
변수선언은 주로 지역변수를 의미, 지역변수는 위 4가지 중 스택 영역
스택 구조의 메모리는 자동 관리되므로 스택을 사용하는 변수를 '자동변수'라 부름
---------------------------------------------------------------------------
컴파일러가 알아서 처리했으므로 변수 선언으로 확보하는 메모리 종류는 별도 언급 없었음.
메모리 종류는 영어로 storage-class ( 기 억 부 류 , 기 억 류 )
변수를 선언할 때 자료형 앞에 명시하는 예약어를 storage-class specifier (기 억 부 류 지 정 자)
- extern , 외부
- auto , 자동 - 선언 없으면 auto
- static , 정적
- register , 레지스터 - cpu가 가진 메모리
ex)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
auto char astrList[3][12] = { "철수", "길동", "영희" };
PrintUser(astrList);
return 0;
}
--------------------------------------------------------------------------------------------
* 정적변수 static
ex)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void TestFunc(void)
{
int nData = 10;
printf("%d\n", nData++);
}
int main(void)
{
TestFunc();
TestFunc();
TestFunc();
return 0;
}
------------------------
10
10
10
ex)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void TestFunc(void)
{
static int nData = 10; // 정적변수 --> 전역변수와 달리 독립된 두 함수간 논리적으로 연결하여 불필요한 의존성을 만들지는 않는다
printf("%d\n", nData++); // 전역변수나 정적변수 모두 동시성을 지원하기 어렵다. 멀티쓰레드 환경인 요즘, 성능과 직결.
} // 사용엔 신중을 기해야 한다.
int main(void)
{
TestFunc();
TestFunc();
TestFunc();
return 0;
}
------------------------
10
11
12
* 동시성 문제
1. TV보기
2. 라면먹기
--> 동시성 있음
3. 외출
--> 2,3 간에는 동시성 없음
* 쓰레드간 전역변수 또는 정적변수를 이용하면서 충돌할 가능성 있음 --> TLS (ThreadLocalStorage) 옵션이 생김
* 레지스터 변수 register
- 임베디드 운영체제나 H/W를 위한 프로그램을 제작하는 경우가 아니면 크게 따질 필요가 없다
- 다만 문법상 주의할 것 하나.
ex)
#include <stdio.h>
int main(void)
{
register int i = 0;
printf("%d\n", i);
printf("%p\n", &i);
return 0;
}
--------------------
error C2103: 레지스터 변수에 '&'이(가) 있습니다.
---> register 메모리 상에는 모두 별도(고유) 이름이 있음. 주소가 없다