나는 벡터가 내부적으로 동적 배열을 이용하여 구현된 줄 알았는데
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #include <iostream> #include <cstdio> #include <thread> #include <vector> #include <random> #define SIZE 10 //배열과 벡터를 받는다. 벡터는 레퍼런스를 이용하여 넘긴다. void Print(std::vector<int>& v, int* arr) { // v 벡터의 원소에 0~10사이의 값을 더해준다. printf("벡터 :"); for (int i = 0; i < SIZE; i++) { std::random_device rd; int input = rd() % 10; v[i] += input; printf("[%d] ", v[i]); } puts(""); // arr 배열의 원소에 0~10사이의 값을 더해준다. printf("배열 :"); for (int i = 0; i < SIZE; i++) { std::random_device rd; int input = rd() % 10; arr[i] += input; printf("[%d] ", arr[i]); } puts(""); } int main() { std::vector<int> v; v.reserve(SIZE); std::random_device rd; int arr[SIZE]; //벡터와 배열 초기화 for(int i=0; i<SIZE; i++) { int input = rd() % 10; v.push_back(input); arr[i] = input; } std::thread t1(Print,v,arr); t1.join(); //스레드 이후의 상황 puts(""); printf("벡터 :"); for (int i = 0; i < SIZE; i++) { printf("[%d] ", v[i]); } puts(""); printf("배열 :"); for (int i = 0; i < SIZE; i++) { printf("[%d] ", arr[i]); } return 0; } | cs |
저런 결과가 나오넹.
배열은 데이터 영역에 속하니까 저렇게 될 거는 예상했는데
벡터는 따로 노네. 벡터는 그럼 스택 영역에 속한것인데..
이게 먼코드임
이코드로 어떻게 메모리 위치를 알음?
+엉아 고맙습니다
땡큐소머취
위 코드는 스레드 생성해서 돌린거임. 스레드는 그 특징으로 자신만의 스택영역을 가지고, heap, data,code 영역은 공유를 함. 배열의 경우 heap이에 할당하므로 스레드는 배열을 공유하는데 벡터도 그런가? 싶어서 한 번 짜본거임
아 주소를 찍는게 아니라
벡터객체가 스택에 생기고 내부적으로 포인터쓰니까 같아야하는데
스택에 생긴 벡터를 그대로 레퍼런스한거니까 스택에 있는 자료를 다른쓰레드에서 포인터로 접근한거아님?
실행된다는게 이상해서 찾아봤더니
http://stackoverflow.com/questions/5116756/difference-between-pointer-and-reference-as-thread-parameter
쓰레드 생성자 시그니쳐에서 레퍼런스를 못받음
값에의한 복사가 일어나고이따
쓰레드쓸때 항상 인자 전부 바인딩하고 함수만 넘겨줘서 몰랐는데 이런게 있네
오호 레퍼런스 자체를 못 받는구나. 그래도 레퍼런스가 없어도, 벡터 자체가 힙 영역에 저장되는 종류라면 레퍼런스 상관없이 배열처럼 전후가 같아아 하는데, 그게 아니더라고
해보니까 아니더라고, 그런데 +엉아가 알려준 방식으로 하니까 heap으로 넘어갔음
벡터자체는 스택임 지역변수니까
new로하면 힙이고
들어있는 알맹이는 항상 힙이겠지 동적할당이니까
ㅇㅇ