본문 바로가기

assortrock

c++ 5일차

RAM, ROM

 

RAM(Random Access Memory, 램)

- 휘발성 메모리(Volatile memory)

- 전원이 차단되면 데이터가 사라짐

- Random Access(임의 접근)란 : 1부터 n 까지 차례 대로 메모리의 주소가 있다면 어느 부분도 즉시 기억 데이터를 읽어 낼 수 있는 호출 방식( Sequential Access(순차적 접근): 1부터 n까지의 메모리 주소에 대하여 특정 주소에 접근하기 위해 1부터 한단계씩 거쳐가야하는 호출 방식)

- 빠른 부품인 CPU와 느린  HDD사이에 위치하여 처리 속도를 보완한다.

 

 

ROM(Read Only Memory, 롬)

- 비휘발성 메모리(Non-Volitile Memory)

- 전원이 차단되어도 데이터가 사라지지 않음

- 한 번 기록된 정보를 빠른 속도로 읽을 수만 있고 수정할 수 없는 메모리.

- ROM은 정보를 다시 쓰고 지울 수 있는 방식에 따라 MASK  ROM, PROM, EPROM, Flash Memory 등으로 구분된다

- MASK ROM : 제조과정에서 미리 내용을 미리 기록해 놓은 메모리, 사용자가 수정할 수 없다.

- PROM : 사용자가 한번 기록할 수 있는 롬

- EPROM : 필요 시 기억된 내용을 지우고 다른 내용을 기록할 수 있다.( 전기적으로 정보를 기록하고 소자에 강한 자외선을 비추어 정보를 지울 수 있기 때문에 반복해서 여러번 정보를 기록할 수 있는 것이 장점)

 

 

변수

 

변수의 속성

1. 범위 (scope)

변수가 사용이 가능한 영역

 

2. 생존시간(life time)

변수가 생성되어 소멸하기까지의 시간

자동 할당(automatic allocation), 정적 할당(static allocation), 동적 할당(dynamic allocation)으로 구분

 

3. 연결(linkage)

각 소스 파일의 상호관계에서 변수의 연결 상태.

같은 이름의 여러 식별자가 같은 식별자를 참조하는지를 결정한다.

지역변수는 링크가 없는 변수이다.

 

지역변수(Local Variable) 

중괄호 내부 혹은 함수의 매개변수에서 사용되는 변수stack 영역에 저장되며 '선언된 함수 내부에서 사용(블록 스코프 : 정의된 블록 내에서만 접근 가능)'되고 '함수가 종료되면 소멸 ( 자동주기 : 정의 지점에서 생성, 블록 종료 지점에서 소멸)'한다.

for 반복문, if 조건문 혹은, { } (중괄호) 에서 생성되는 변수도 지역변수이며 함수내부이나 for, if, { } 외부의 변수와 변수명이 같더라도 같은 변수로 취급하지 않는다.

초기화 하지 않으면 컴파일 에러가 나거나 쓰레기 값이 저장된다.

생명 주기 때문에 자동으로 사라진다고 하여 자동 변수(auto variable)이라고 하며 auto 키워드를 생략하고 사용한다.

 

전역변수(Global Variable)

중괄호 외부에서 선언되어  data 영역에 할당.

전역 스코프(범위)를 가지며 프로그램의 모든 위치에서 사용할 수 있다.

다른 파일에서 정의된 변수에 접근하려면 exteren 을 통해 전방선언을 해야한다.

전역변수와 같은 변수명으로 지역변수를 만든다면? => 그 지역 안에서는 지역변수가 사용된다. 그러나 Scope연산자(전역범위 연산자(::))를 사용하면 컴파일러는 지역변수 대신 전역변수를 사용한다.

각가의 cpp 파일에서 같은 변수명의 전역변수가 있을 때 컴파일 단계에서는 오류가 없지만 링크 단계에서 에러가 발생한다. error LNK(숫자) 등

관습적으로 g_ 접두사를 통해 전역 변수를 식별하기 편하게 한다.

 

- 정적변수(static 키워드)

하나의 파일 내에서만 접근할 수 있는 전역변수.

내부 링크가 있는 변수, 변수가 정의된 소수 파일 내에서 어디서나 접근할 수 있지만, 소스 파일 외부에서는 참조할 수 없다.

지역변수에 static 이 붙어서 정적 지역변수가 되었을 때 

 접근 범위는 보통 지역변수와 같다.

 그러나, 함수가반환하여도 지역변수는 프로그램 종료할 때까지 살아있다.

 초기화 하지 않으면 초기 값은 자동으로 0이 된다.

Q. 함수내의 정적 지역 변수는 언제 초기화 될까? 함수 시작 부터 일까. 프로세스(프로그램) 시작 부터 일까.

 프로세스가 시작될 때 데이터 영역에 생성되고, 프로세스가 종료될 때 소멸 된다( 함수가 시작할때 생성되는 것이 아니다). 1. 초기화 없는 경우, 2. 0으로 초기화한 경우 , 3. 0 이외의 상수로 초기화한 경우, 4. 함수로 초기화한 경우 총 네가지의 경우에서 모두 프로세스 시작시 메모리가 할당된다. 또한 동시에 초기화도 된다. 정확히는 3번에서 0이 아닌 상수가 3이라 가정할 때 프로세스 시작된 이후 대상인 정적 지역 변수가 포함되어 있는 함수가 호출되기 전에 이미 1,2,4, 번은 0으로 3번은 3으로 초기화 된다. 3으로 초기화한 3번과 1, 2, 4번의 메모리주소가 출력해보면 차이가 난다는 것을 확인 할 수있는데 이는 메모리 영역이 다르기 때문이다. 전역 변수나 정적 변수가 저장 되는 데이터 영역은 두 가지로 바로 초기화된 데이터 영역과 초기화 되지 않은 데이터 영역이나 보통 Data영역과 BSS(Block Stated Symbol)영역이라고 부른다. BSS영역에는 초기화 되지 않은 전역변수나 정적 변수가 위치하는데, 프로세스 시작 시 가장 기본이 되는 값 (0; null으로 초기화가 이뤄진다. Data 영역에는 0이 아닌 상수로 초기화 되는 전역변수나 정적 변수 즉 3번과 같은 경우의 전역 변수 혹은 정적변수가 위치하게 된다. Data 영역의 값은 이미 실행 이미지 (exe)에 기록되어 있기 때문에 프로세스 시작이 실행 이미지로부터 그대로 복사된다는 특징이 있다.

 

 

- 외부변수(extern 키워드)

외부 링크가 있는 변수, extern 변수는 정의된 소스 파일과 다른 소스 파일 모두에서 접근할 수 있다.

 

* 기본적으로 전역변수는 extern 변수로 간주한다. 하지만 const(상수)전역변수의 경우  static 으로 간주된다.

 

* extern 변수 전방 선언

변수 전방 선언이 함수 외부에서 선언되면 소스 파일 전체에 적용된다. 함수 내에서 선언되면 해당 블록 내에서만 적용된다.

 

* 변수가 static 으로 선언된 경우, 이에 접근하기 위해 변수 전방 선언을 해도 적용되지 않는다

 

 

기타

- 컴파일러는 파일 단위에서만 확인한다.

- 실제 외부 변수의 연결은 link 단계에서 실행된다.

- 헤더파일에 변수를 선언하면 헤더파일을 include 한 모든 파일에 그 변수가 참조되기에 오류가 난다.(전역변수가 여러개 있다고 판정(이때 static 변수면 상관없다))  => 보통 헤더파일에 전방선언만 두고 변수선언을 하지 않는다. 

'assortrock' 카테고리의 다른 글

c++7일차  (0) 2022.05.19
c++ 6일차  (0) 2022.05.18
c++ 4일차  (0) 2022.05.15
c++ 3일차  (0) 2022.05.12
c++ 2일차  (0) 2022.05.11