[42Seoul] CPP Module 01 - ex00

수빈·2022년 1월 11일
0

42CPP

목록 보기
5/11
post-thumbnail

인스턴스를 생성하는 두 가지 방법

Zombie stackZombie = Zombie("stackZombie");
Zombie *heapZombie = newZombie("heapZombie");

1번은 stack에 할당, 2번은 heap에 할당하는 방식이다. heap에 할당하고 싶다면 new예약어와 포인터 변수를 사용하면 된다

stack과 heap을 익히기 전 메모리 구조에 대해 알면 더 좋다. 프로그램이 실행되기 위해서는 프로그램이 메모리에 로드가 되어야 하며, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.

따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공한다. 프로그램이 운영체제로부터 할당 받는 대표적인 메모리 공간은 4가지다.

  1. code, 2. data, 3. stack, 4. heap

code

실행할 프로그램의 코드가 저장되는 영역이다. text영역이라고도 함. CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리함.

data

프로그램의 전역 변수와 정적 변수가 저장되는 영역이다. 데이터 영역은 프로그램의 시작과 함께 할당되며 프로그램이 종료되면 소멸한다.

stack

함수의 호출과 관계되는 지역 변수와 매개변수가 저장된다.

stack영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. stack에 저장되는 함수의 호출 정보를 stack frame이라고 함.

stack영역은 push로 데이터를 저장하고, pop으로 데이터를 인출한다. 이러한 stack은 후입선출 방식에 따라 동작하기 때문에 가장 늦게 저장된 데이터가 가장 먼저 pop된다.

stack영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됨.


런타임 시점에서 크기가 결정된다

LIFO 구조이다 (LIFO == 후입선출 Last In, First Out)

선언한 함수 영역을 벗어나면 자동으로 소멸

. 연산자를 통해 접근

heap

사용자가 직접 관리할 수 있고, 그래야만 하는 메모리 영역이다. 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

heap영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.


컴파일 시점에서 크기가 결정된다

동적 메모리 할당을 통해 저장되는 영역

힙 영역은 모든 프로세스에서 동적으로 로드된 모듈에서 공유된다

-> 연산자를 통해 인스턴스에 접근

사용이 종료된 시점에서 할당을 해제하지 않으면 메모리 릭이 발생

stack과 heap의 장단점

stack

  • 매우 빠른 엑세스
  • 변수를 명시적으로 할당 해제하지 않아도 된다
  • 공간은 cpu에 의해 효율적으로 관리되며 메모리는 단편화 되지 않는다.
  • 지역 변수만 사용한다
  • stack 크기가 os에 따라 제한된다
  • 변수의 크기를 조정할 수 없다

heap

  • 변수를 전역적으로 액세스 할 수 있다
  • 메모리 크기 제한 없다
  • 상대적으로 느린 액세스
  • 호율적인 공간 사용을 보장하지 못하면 메모리 블록이 할당된 후 시간이 지남에 따라 메모리가 조각화되어 해제될 수 있다
  • 메모리를 직접 관리해야 한다(변수 할당, 해제는 직접)
  • c에서는 realloc, c++에서는 new (java도 new)

newZombie vs randomChump

newZombie 함수는, 다른 곳에서도 생성한 좀비 인스턴스를 사용할 수 있어야하므로 힙영역에 인스턴스를 생성하는 것이 적절하고, randomChump 함수 같은 경우는 함수 내에서 인스턴스가 자신의 역할을 전부 수행하기 때문에 스택영역에 할당해도 무방하다.

main.cpp

const	std::string NAME[] =
{
	"zombie00",
	"zombie01",
	"zombie02",
	"zombie03"
};

int	main(void)
{
	Zombie stackZombie = Zombie("stackZombie");

	Zombie *heapZombie = newZombie("heapZombie");
	delete heapZombie;

	for (int i = 0; i < 4; i++)
	{
		randomChump(NAME[i]);
	}
}

  1. stackZombie는 stack에 할당되었기 때문에 따로 해제를 하지 않아도 프로그램 종료와 함께 소멸한다
  2. heapZombie는 heap에 할당되었으며 delete heapZombie 으로 직접 소멸을 명령했다
  3. 반복문으로 randomChump 함수를 실행시켰으며 1번과 같이 stack 영역에 할당해 함수 내 인스턴스가 자신의 역할을 모두 수행했기 때문에 자동으로 소멸된다.
profile
42Seoul -soooh ~ 2022.04

0개의 댓글