깊은 복사와 얕은 복사, memcpy(), copy()
깊은 복사와 얕은 복사
깊은 복사와 얕은 복사의 차이점은 실제값 접근 여부이다.
용어에서 유추할 수 있듯이 깊은 복사는 말 그대로 깊게 실제값 그 자체를 복사해온다.
반대로 얕은 복사의 경우 실제값까지 접근하지 않고 주소값만을 복사해온다.
쉽게 말하자면 깊은 복사의 결과물은 새로 생긴 하나의 복제품인 반면, 얕은 복사의 결과물은 바로가기와 같다
즉 A = { 1, 2, 3 } 를 복사하여 B = { 1, 2, 3 } 가 생겨났다고 했을 때
깊은 복사의 경우 B는 A와 독립적이므로 A가 { 4, 5, 6 } 으로 변해도 B는 { 1, 2, 3 }의 값을 유지한다.
얕은 복사의 경우 B는 A의 주소값을 복사해왔으므로
그 주소값의 실제값인 A가 { 4, 5, 6 }으로 변하면 B 또한 { 4, 5, 6 }으로 변하게 된다.
memcpy()와 copy()
어떤 변수를 깊은 복사할 때 memcpy()와 copy()를 사용한다.
memcpy()는 Array끼리 복사할 경우 사용되고 copy()는 Array와 vector에 모두 쓰인다.
🔎 memcpy()
memcpy()는 memory + copy 즉 메모리의 값을 복사하는 기능을 수행한다.
vector에서는 깊은 복사가 되지 않는다. → vector는 TriviallyCopyable 타입이 아니므로
void * memcpy(void * destination, const void * source, size_t num);
void * destination → 복사 받을 메모리를 가리키는 포인터
const void * source → 복사할 메모리를 가리키는 포인터
size_t num → 복사할 데이터의 길이(바이트 단위)
사용예시
#include <bits/stdc++.h>
using namespace std;
int main(){
int sour[3] = {1, 2, 3};
int dest[3];
memcpy(dest, sour, sizeof(sour));
for(int i = 0; i < 3; i++){
cout << dest[i] << " ";
}
cout << "\n";
}
출력 결과
1 2 3
🔎 copy()
copy()는 memcpy()와 같은 동작을 하지만 벡터에서도 사용이 가능하다.
void * memcpy(sour.begin(), sour.end(), dest.begin());
sour.begin() → 복사할 벡터의 시작 이터레이터(배열의 시작 주소값)
sour.end() → 복사할 벡터의 마지막 이터레이터(배열의 마지막 주소값 + 1)
dest.begin() → 복사 받을 백터의 시작 이터레이터(배열의 시작 주소값)
사용예시
//vector
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> sour { 1, 2, 3 };
vector<int> dest(3);
copy(sour.begin(), sour.end(), dest.begin());
for (int i = 0; i < 3; i++) {
cout << dest[i] << " ";
}
cout << "\n";
}
//Array
#include <bits/stdc++.h>
using namespace std;
int main() {
int sour[3] = { 1, 2, 3 };
int dest[3];
copy(sour, sour + 3, dest);
for (int i = 0; i < 3; i++) {
cout << dest[i] << " ";
}
cout << "\n";
}
출력 결과
1 2 3
댓글남기기