본문 바로가기
SWE/C++ OOP

Vector C Array | 메모리 복사 | 메모리 계산 | Address 연산

by S나라라2 2022. 1. 11.
반응형

 

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로 캐스팅해서 해당 주소에 적혀있는 값(*)을 읽으면 된다.

 

 

반응형