인프런 커뮤니티 질문&답변

상병님의 프로필 이미지
상병

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

vector #1

vector 질문

작성

·

575

0

1. vector는 힙메모리에 할당되는 동적'배열'이고, 배열이라고 한다면  'vector의 이름은 스택메모리에 할당이 되고, 힙메모리에 할당되어 있는 원소 집합의 첫번째를 가리키는것(주소)'으로 이해했는데요. 제가 이해한것이 맞나요?

2. 그리고 벡터를 class의 멤버 배열로 만들어 주려면 어느방식으로 만들어 주어야 효율적인가요?

예를들어 배열같은 경우는

멤버로 int *arr을 가지고 생성자에서  arr = new int[5]; 이런식으로 만들어 주면 class는 주소값만 가지니 그냥 int arr[5]를 가지는것보다 스택 메모리에 할당되는 용량이 효율적이다(?) 라고 생각 하고있었는데,

벡터는 위처럼 하려면 어떻게 해야하나요?

원소들은 힙메모리에 할당되니 그냥 vector<int> v를 멤버로 가지고 쓰면 되나요?

이해도가 아직 낮아 횡설수설한점 죄송합니다. 

 

답변 1

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

1.
네 비슷합니다.
vector class에 포함되는 멤버 변수들은
데이터의 시작 주소와 데이터 개수 등이 있을테고,

어떤 함수 내에서

void Func()
{
  vector<int> v;
}

벡터를 사용한다면 당연히 vector의 멤버 변수들은 스택 메모리에 있지만
실제 데이터는 힙에 위치해 있겠죠.

2.
우선 class의 멤버 변수가 항상 stack에 올라간다고 가정을 하시면 안 됩니다.
가령 vector<int> 를 class의 멤버 변수로 들고 있다고 가정해봅시다.

class Knight
{
    vector<int> items;
}

이 상황에서

void Func()
{
   Knight k1;
}

를 만들었다면, k1이 스택에 있고 vector<int> items도 자연스럽게 스택에 올라가는게 맞긴 합니다.
하지만.

void Func()
{
 Knight* k1 = new Knight();
}

로 만들었다면 
- 스택에는 k1의 주소
- 실제 Knight 객체는 힙에
- 따라서 vector<int> items도 힙에

올라가게 됩니다.

그리고 vector<>를 멤버 변수로 사용할 때는 그냥 class에 넣어서 사용해도 되긴 하지만,
vector<T> 내부에 들어가는 데이터가 엄청 방대한 것이라면
복사가 부담스럽기 때문에 포인터로 들고 있는 것이 좋습니다.

ex)

class Knight
{
   vector<Item*> items;
}

다양한 상황이 있을 수 있는데 직접 해보면서 경험해보시는게 좋습니다.

상병님의 프로필 이미지
상병
질문자

자세한 답변 감사드립니다

상병님의 프로필 이미지
상병

작성한 질문수

질문하기