깊은 복사와 얕은 복사

깊은 복사와 얕은 복사의 차이점은 실제값 접근 여부이다.
용어에서 유추할 수 있듯이 깊은 복사는 말 그대로 깊게 실제값 그 자체를 복사해온다.
반대로 얕은 복사의 경우 실제값까지 접근하지 않고 주소값만을 복사해온다.

쉽게 말하자면 깊은 복사의 결과물은 새로 생긴 하나의 복제품인 반면, 얕은 복사의 결과물은 바로가기와 같다

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

태그:

카테고리:

업데이트:

댓글남기기