12.1 메모리 레이아웃 훑어보기
C 언어로 작성한 프로그램이 메모리에서 어떻게 사용되는지에 대한 내용이다.
주의 할점은 초기화 되지않은 전역/정적변수는 BSS에 저장되고 그공간에 있는것들은 프로그램이 시작 될때 0으로 초기화됨. 오히려 한꺼번에 모아서 0으로 초기화 해주기위해 BSS에저장된다고 생각할것
12.2 객체와 식별자, lvalue와 rvalue
12.3 변수의 영역과 연결 상태, 객체의 지속 기간
file 스코프를 지닌 전역 변수 의 사용은 이하와 같다.
file 스코프에 있는변수는 프로그램 전체에서 사용할수 있는것처럼 사용이 가능해서 전역변수라고 부른다.
file 스코프에 있는변수를 static과 함께 선언하면 해당 파일 내부에서만 쓸수있게 범위가 아래사진처럼 제한된다.
Duration이란 메모리에 존재하는 기간을 의미하며 4가지가 존재한다.
- static storage duration :프로그램이 시작때부터 끝날때까지 계속 메모리에 static 하게 존재 한다는 것
- automatic storage duration //스택과 관련있음.
- allocated storage duration //동적할당과 관련있음.
- thread storage duration
12.4 저장 공간의 다섯 가지 분류
변수가 저장되는것을 5가지로 나눠 볼 수있다.
12.5 자동 변수
Automatic storage class를 사용하는 변수
지금까지 사용해온 지역변수는 사실 Automatic storage class 었음. 프로그램 전체에서 계속 사용할 변수가 아니라면 계속 메모리에 놔둘 필요가 없음 -> 사용하지 않을때 다른 변수가 사용할 수 있도록 자리를 내줌.
그리고 지속기간이 자동으로 바껴서 Linkage가 안됨(외부로 연결이 안됨).
블럭이나 함수헤더에 선언된것이 이 유형에 포함됨 스택과 스택프레임에대한 간략 한 설명은 13분 23초 참고.나머지부분은 기존 지역변수 설명강의에서의 내용과 동일하여 따로 정리하지 않겠음.
12.6 레지스터 변수
레지스터는 CPU의 일부로 CPU가 가지고 있는 임시작업공간이다.
메모리는 CPU와 물리적으로 다른곳에 있고 버스를 통해 서로 데이터를 주고 받는다고 배웠었음 -> 데이터를 주고받는데 시간이 어느정도 걸림
레지스터는 메모리처럼 데이터를 가지고 있을수 있는데 CPU의 일부라 엄청 빠르게작동한다. -> 빠르게 작동하는 프로그램이 필요할때 변수를 레지스터에 놓고 사용해야 할때가 있음.
실제 사용은 이하와 같이 한다.
12.7 블록 영역의 정적 변수
12.8 정적 변수의 외부 연결 external linkage
기본적인 선언방법은 이하와 같다.
referencing declaration은 extern을 붙여서 사용할 수 있다.
다른 파일에서 쓰려면
1. 전역변수로 선언하거나
2. 지역변수로 스코프내에 일일이 extern과 함께 referencing declaration을 할 수 있다.
12.9 정적 변수의 내부 연결 internal linkage
file scope 선언앞에 static을 붙이면 해당 파일에서만 사용가능한 변수가됨.
12.11 함수의 저장 공간 분류
함수는 external이 기본이고 static도 가능함. 디폴트로 함수는 프로그램과함께 로딩되어 메모리에 계속있음
기본적으로 함수선언은 extern으로 여겨짐. (기본함수 선언은 extern을 생략이 가능한거임)
함수에 static을 붙여주면 함수의 사용 스코프가 제한됨.
static은 프로토타입에만, 함수의 바디에만, 둘다 붙여도 문법적으로 ok
12.13 메모리 동적 할당
"동적 = 컴파일타임이 아니라 런타임에 결정된다는 것"
동적할당 메모리를 받아올때는 malloc()을 사용한다. 그리고 메모리를 다사용했으면 free()를 꼭 사용해줄것
기본적인 사용법은 이하와 같다.
malloc은 줄수있는 메모리 공간이 없으면 NULL 포인터를 리턴하며 이하와 같이 대응 할 수 있다.
동적할당으로 받은 메모리를 다썻으면 free를 해줘야하는데 결국 포인터는 별도의 변수기 때문에 free이후의 포인터변수의 주소는 변화하지 않는다. (그래서 다쓴 동적할당 메모리의 포인터는 NULL 포인터로 바꿔주는게 좋음
동적할당 메모리는 배열처럼 사용할 수 있다.
배열안의 원소의 값을 초기화를 안해주면 쓰레기 값이 들어있는 상태다.
12.14 메모리 누수와 free()의 중요성
강의 전반의 내용은 꼭 free()를 해줘야 한다는 거였다. 안해주면 메모리누수가 일어난다는 것.
12.15 동적 할당 메모리를 배열처럼 사용하기
동적할당 메모리는 이하의 예시처럼 1차원 배열처럼 이용할 수 도 있다.
이하처럼 열과 행을 상수로 선언하여 2차원 배열처럼도 사용가능
그러나 상수로 사용하는것은 별의미가 없어서 이하처럼 사용하는게 더 많다.
12.16 calloc(), realloc()
calloc과 malloc은 기능상 똑같은데 문법적으로 받는 인자가 2개라는게 다르다. 그리고 calloc은 0으로 초기화를 해준다는 점이 다르다.
realloc은 동적할당으로 받은 메모리크기를 조정할수 있다. 그리고 추가된 공간에 대해 초기화를 해주지 않아서 쓰래기값이 존재하게 된다.
12.18 자료형 한정자들 const, volatile, restrict
const는 기존의 내용과 같아서 생략. volatile은 내가 선언한 변수가 컴파일러가 모르는 상황에서 바뀔수도 있다고 명시 해주는것.restrict는 데이터 오브젝트에 접근하는게 이거 하나뿐이다고 주장하는것.
'TIL > 따배씨' 카테고리의 다른 글
구조체(2021-01-25~2021-01-29) (0) | 2021.01.25 |
---|---|
파일입출력의 작동원리 (2021-01-22~2021-01-23) (0) | 2021.01.22 |
문자열 함수들 (2021-01-19~2021-01-21) (0) | 2021.01.19 |
배열과 포인터(2021-01-15 ~ 2021-01-17) (0) | 2021.01.15 |
함수 (2021-01-13 ~ 2021-01-14) (0) | 2021.01.13 |
댓글