프로세스 메모리 구조는 이런 식으로, 스택과 같은 경우는 위쪽에서부터 촘촘하게 아랫방향으로 진행되고, 힙은 아래쪽에서 위 방향으로 채워져 올라가는데 힙 메모리의 특성상 중간중간에 비어 있을 수 있다. 프로그램의 실행 과정 중에서 새로운 공간을 할당받고, 이미 할당받은 메모리가 해제되면서 빈 공간이 생기기 때문이다. 앞선 챕터들에서 힙과 스택 메모리의 장단점과 특징, 그리고 그 차이점에 대해 알아보았다. 정리해보면, Stack 스택 메모리는 1) stack frame 스택 프레임 단위로 할당 해제가 된다. 2) 할당 해제의 위치는 항상 탑 위치에서부터 일어나게 된다. (위 프로세스 메모리 뷰 위쪽) Heap 힙 메모리는 1) 새로운 메모리 공간을 받기 위해 힙 공간 중간에 어느 파트가 비어 있는지 확인해야..
모던C++/메모리 구조 Memory Structure
힙 메모리 사용 방법 1) C Style 2) C++ Style 3) Safer C++ Style 1. C스타일 (1)malloc 명령어 사용 (2) C style class Cat 컴파일: 된다. 그런데, 분명히 컨스트럭터와 디스트럭터를 생성해 놓았음에도 불구하고 "meow" "bye" 가 호출되지 않는다. *C 스타일(malloc) 의 힙 메모리 관련 명령어들은 그냥 사용하지 말 것. 2. C++ 스타일 new, delete 키워드 사용 방금 코드에서 malloc 부분을 new로, free 부분을 delete로 치환해 보자. //array의 경우 //int의 경우에는 3. Safer C++ style 위의 방식대로 할 경우에...만약에 if 프로그래밍을 하다가 delete 부분을 잊어버린다면? 즉, ..
필요 사전 지식 메모리 동적 확보, 배열의 동적인 확보 메모리 동적 확보, 배열의 동적인 확보 참고 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) -> 그 이유는, 포인터는 격자무늬 메모리 구조에서 각각의 주소를 나타..
sizeof() : 변수의 사이즈를 알아내는 방법 예제) 1 byte = 8 bit. 컴퓨터는 0과 1로 동작하는데, 그 단위가 1bit. 8bit는 이런 0과 1로 동작하는 칸이 8개 있다는 의미. int 타입은 4byte 를 가지고 있다. a 변수를 할당하는 순간 4byte의 공간을 차지한다는 의미. 정수 short int long = 2 4 8 byte 양수정수에는 unsigned를 붙여주면 됨. 실수 float double = 4 8 byte cppreference에서 각 변수 타입의 크기를 체크해보면 이렇다. https://en.cppreference.com/w/cpp/language/types Fundamental types - cppreference.com (See also type for ..
Stack Variables 스택 변수 : 변수가 많아질수록 메모리 공간이 위로 쌓여간다고 하여 stack. 컴퓨터가 변수를 인식/접근하는 방법 : 메모리 맵에서 가장 위에서부터 몇 번째에 위치하고 있는지로 구분한다. 변수의 이름을 기억하지 않는다. 예제) 이 때, 우리가 생각하는 추상적인 메모리 구조는 이런 느낌이다. 하지만, 실제 작동하는 stack 메모리 구조를 추상적으로 표현해 보면 이런 식이다. 각 변수의 주소를 출력해서 실제로 그런지 확인해 보자. Stack 메모리의 주소가 큰 수(a)에서 작은 쪽으로(d) 쌓여 나간다는 것을 실제로 확인해 볼 수 있다. 즉 이런 식이다! 더 로우 레벨로 내려가면 실제 메모리 구조는 격자 무늬로 되어 있다. 그렇다면 이런 모양으로 구성되었을 것이다. 주의점! ..