Q. vector의 Raw 데이터 메모리 주소 접근 방법
std::vector<int> vec;
방법1) vec이 empty가 아닐 때만 가능. 비어있을 경우, vec[0]이 없는데 접근하기 때문에 에러난다.
&vec[0]
방법2) 추천방법
vec.data()
Q. vector의 Raw 데이터 메모리 연산 방법 *유의
std::vector<int> vec = {1,2,3,4,5}
vec.data() : 0x0AE21230 {1}
// address
vec.data() + 4 : 0x0AE21240 {5}
// 0x0AE21230 + 4*sizeof(int) = 0x0AE21230 + 16
((unsigned char*)vec.data()) + 4 : 0x0AE21234 {2}
// 0x0AE21230 + 4
vec.data() + n : 주소값 계산이 아니라 value계산으로 된다.
((unsigned char*)vec.data()) + n : 주소값 계산이 됨
Q. vector에서 C Array로 옮기는 방법
1) memcpy
std::vector<int> vec = {1,2,3,4,5};
int array[5] = {0,};
memcpy(array, vec.data(), sizeof(int)*vec.size());
vec.data()를 호출하면 raw data의 주소가 반환되고, 메모리를 복사한다.
array가 vec의 사이즈보다 작을 경우 에러난다.
2) memcpy + Array 동적 할당
std::vector<int> vec = {1,2,3,4,5};
int size = vec.size();
int* array = new int[size];
memset(array, 0, sizeof(int)*size);
memcpy(array, vec.data(), sizeof(int)*vec.size());
위의 사이즈 문제를 해결할 수 있다.
참고로 array 동적으로 할당해준 다음에 0으로 초기화 해주는 것을 잊지말자.
Q. C Array 에서 vector로 옮기는 방법
1) memcpy
int array[5] = {1,2,3,4,5};
std::vector<int> vec;
vec.reserve(5);
memcpy(vec.data(), array, sizeof(int)*5);
메모리를 직접 복사하였기 때문에 vec의 rawData가 그대로 옮겨가긴 한다. 그러나 vector의 size(), contains(), at() 과 같은 기본 메소드들을 사용하지 못한다. 따라서 절대 비추천하는 방법
2) std::copy
int array[5] = {1,2,3,4,5};
std::vector<int> vec = {10,20,30};
std::copy(array, array+5, std::back_inserter(vec));
// result: vec = 10,20,30,1,2,3,4,5
standard library 에서 제공해주는 copy를 이용한다. 두 번째 인자는 array 인자의 갯수를 더해줘야 한다.
vector에 기존값이 있었다면 그 뒤에 덧붙여지게 된다.
Q. int 를 C Array에 메모리 복사하는 방법 - memcpy
unsigned char array[4] = {0,};
int num = 5;
// array 에 쓰기
memcpy(array, &num, sizeof(int));
// array에서 읽기
int result = *(int*)array;
array 배열에 num 메모리를 복사해서 쓰면 다음과 같다. array은 unsigned char로 한 칸에 1byte이고, num은 integer로 4byte이다. 따라서 array 배열의 4칸을 사용해서 num을 복사하게 된다.
array의 메모리르 살펴보면 아래와 같다.
// array[0] array[1] array[2] array[3]
// 00 00 00 05
array에서 값을 읽어올때는 integer로 캐스팅해서 해당 주소에 적혀있는 값(*)을 읽으면 된다.