vector 질문
655
작성한 질문수 21
1. vector는 힙메모리에 할당되는 동적'배열'이고, 배열이라고 한다면 'vector의 이름은 스택메모리에 할당이 되고, 힙메모리에 할당되어 있는 원소 집합의 첫번째를 가리키는것(주소)'으로 이해했는데요. 제가 이해한것이 맞나요?
2. 그리고 벡터를 class의 멤버 배열로 만들어 주려면 어느방식으로 만들어 주어야 효율적인가요?
예를들어 배열같은 경우는
멤버로 int *arr을 가지고 생성자에서 arr = new int[5]; 이런식으로 만들어 주면 class는 주소값만 가지니 그냥 int arr[5]를 가지는것보다 스택 메모리에 할당되는 용량이 효율적이다(?) 라고 생각 하고있었는데,
벡터는 위처럼 하려면 어떻게 해야하나요?
원소들은 힙메모리에 할당되니 그냥 vector<int> v를 멤버로 가지고 쓰면 되나요?
이해도가 아직 낮아 횡설수설한점 죄송합니다.
답변 1
1
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;
}
다양한 상황이 있을 수 있는데 직접 해보면서 경험해보시는게 좋습니다.
visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.
0
559
1
정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?
0
453
1
strcpy() 구현 관련 질문
0
534
1
빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?
0
475
1
클래스 타입의 포인터 질문합니다
0
559
1
입력값을 enum 값에 넣어주는거 이제 막혔나요?
0
503
1
템플릿 특수화 관련 질문
0
389
1
포인터 관련 질문합니다!
0
270
1
Unable to start assembler. Check your settings.
0
848
2
cpu선택
0
548
1
포인터 질문이 있습니다
0
331
1
20:35 에서 구조체 크기에 대한 질문입니다!
0
589
1
iterator 삭제관련
0
415
1
함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!
0
316
1
15 분 45초 대 질문
0
317
0
스택 프레임 질문합니다!
2
312
1
오른값 참조 in 게임
0
391
0
동적할당 질문이 있습니다
0
457
1
안녕하세요 메모리에 대해 질문드립니다.
0
312
1
함수객체 의 매개변수
0
365
1
복사생성자
0
439
1
main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요
0
430
1
포인터 실습 강의를 보고 궁금한게 있습니다.
0
359
1
스택 오버플로우
2
801
1





