프로세스 메모리 구조는 이런 식으로, 스택과 같은 경우는 위쪽에서부터 촘촘하게 아랫방향으로 진행되고, 힙은 아래쪽에서 위 방향으로 채워져 올라가는데 힙 메모리의 특성상 중간중간에 비어 있을 수 있다. 프로그램의 실행 과정 중에서 새로운 공간을 할당받고, 이미 할당받은 메모리가 해제되면서 빈 공간이 생기기 때문이다. 앞선 챕터들에서 힙과 스택 메모리의 장단점과 특징, 그리고 그 차이점에 대해 알아보았다. 정리해보면, Stack 스택 메모리는 1) stack frame 스택 프레임 단위로 할당 해제가 된다. 2) 할당 해제의 위치는 항상 탑 위치에서부터 일어나게 된다. (위 프로세스 메모리 뷰 위쪽) Heap 힙 메모리는 1) 새로운 메모리 공간을 받기 위해 힙 공간 중간에 어느 파트가 비어 있는지 확인해야..
스택
필요 사전 지식 메모리 동적 확보, 배열의 동적인 확보 메모리 동적 확보, 배열의 동적인 확보 참고 nybot-house.tistory.com/9 변수와 스코프(지역변수와 전역변수) 02.14" data-og-description="변수의 종류 파악하기 지금까지 변수와 배열을 사용했던 곳은 main() 함수 안이거나 직접 만든 함수 안이었다.. nybot-house.tistory.com C++ 는 사용자가 메모리 관리를 직접 해 주어야 하는 Unmanaged Language이다. 메모리 관리에 실패하게 되면 Memory leak, Memory fragmentation 등의 문제가 일어날 수 있다. 힙 메모리를 정확하게 이해한다면 이런 문제들을 피해 프로그래밍을 할 수 있다. Stack VS Heap 비교..
스택 메모리는 흔히 생각하듯이 변수a 변수b 이런 식으로 쌓여가면서 동작하지 않는다. 실제로 스택 메모리는 변수별로 쌓여가는 것이 아니라 Stack Frame 단위로 메모리를 쌓아가면서 동작한다. 이 Stack Frame은 Function 단위로 나누어지고 호출된다. Call Stack foo() 함수 내에서 a b 둘 중 누가 위에 위치할지는 컴파일러가 정해준다. bar() 함수 내에서도 마찬가지. main()함수 내에서도 마찬가지다. (1) 함수가 실행되면 main 함수가 가장 먼저 실행되면서 쌓여진다. (2) foo() 함수를 call 하면서 그 foo()의 stack frame을 그대로 가져와서 위에 쌓는다. (3) foo() 함수가 끝나고 bar() 함수를 호출되면, foo() 부분 메모리를 없..
Struct의 size 이런 경우에는 8 + 4 + 2 = 14 bytes 일 거라고 예상하기 쉽지만 그 이유는 메모리 엑세스 패턴 때문에 컴파일러가 padding 패딩을 사이에 넣어주기 때문이다. 구조체 struct나 클래스 class의 경우에는 padding이 들어가게 되기 때문이다. 클래스/구조체 멤버 정렬 - padding _ 링크 Class의 size : function은 class의 size와 관계 없다. Cat 포인터를 저장하는 변수 catPtr를 하나 만들고 cat1의 주소를 넣어주고 catPtr 의 크기를 출력해보는 프로그램을 만들어보자. 포인터의 경우에는 타입과는 상관없이 항상 8 bytes를 갖는다. (64bit) -> 그 이유는, 포인터는 격자무늬 메모리 구조에서 각각의 주소를 나타..
Stack Variables 스택 변수 : 변수가 많아질수록 메모리 공간이 위로 쌓여간다고 하여 stack. 컴퓨터가 변수를 인식/접근하는 방법 : 메모리 맵에서 가장 위에서부터 몇 번째에 위치하고 있는지로 구분한다. 변수의 이름을 기억하지 않는다. 예제) 이 때, 우리가 생각하는 추상적인 메모리 구조는 이런 느낌이다. 하지만, 실제 작동하는 stack 메모리 구조를 추상적으로 표현해 보면 이런 식이다. 각 변수의 주소를 출력해서 실제로 그런지 확인해 보자. Stack 메모리의 주소가 큰 수(a)에서 작은 쪽으로(d) 쌓여 나간다는 것을 실제로 확인해 볼 수 있다. 즉 이런 식이다! 더 로우 레벨로 내려가면 실제 메모리 구조는 격자 무늬로 되어 있다. 그렇다면 이런 모양으로 구성되었을 것이다. 주의점! ..
참고 nybot-house.tistory.com/9 변수와 스코프(지역변수와 전역변수) 02.14 변수의 종류 파악하기 지금까지 변수와 배열을 사용했던 곳은 main() 함수 안이거나 직접 만든 함수 안이었다. 그러나 변수와 배열의 선언은 반드시 함수 안에서만 해야 하는 것은 아니다. 변수와 nybot-house.tistory.com 메모리의 동적인 확보 전역 변수의 메모리는 프로그램이 시작될 때 확보된다. 또한 일반 지역 변수의 메모리는 함수가 선언되고 호출될 때 확보된다. 이 두 가지 방법 외에도 프로그래머가 원하는 타이밍에 메모리를 확보하는 방법이 있다. 이것을 동적 메모리 확보(dynamic allocation)라고 부른다. 이 방법을 사용하면 변수를 이용한 메모리 사용법과 다르게 프로그래머가 메..
더보기 Code 영역 프로세스가 실행할 코드와 매크로 상수가 기계어의 형태로 저장된 공간이다. 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 지정돼있다. Data 영역 코드에서 선언한 전역변수 또는 static 변수 등등이 저장된 공간이다. 전역변수/static 값을 참조한 코드는 컴파일 하고 나면 Data 영역의 주소값을 가르키도록 바뀐다. 실행 중도에 전역변수가 변경 될 수도 있으니 이 영역은 Read-Write로 지정돼있다. 단, 초기화 되지 않는 전역 변수는 BSS 영역에 할당된다. Stack 영역 (스택) 1) 매개변수, 지역변수 - 함수 2) 함수호출 할당, 함수호출끝 해제 3) 공간이 작다(보통 1mb) 4) 크기가 컴파일 타임에 정해진다. 자료구조로 많이 알려진 ..