본문 바로가기
알고리즘 문제풀이/개념정리

[개념정리] c++ 메모리 영역 복사 (memcpy, copy)

by 로디네로 2021. 4. 24.
반응형

 

https://www.vecteezy.com/free-vector/copy

 

코딩을 하다보면 배열 또는 벡터를 복사할 일이 생긴다.

 

이 때 for loop를 통해 하나하나 복사를 해줄 수도 있고, memcpy를 쓸수도, copy를 쓸 수도 있을 것이다.

 

각각에 대해 알아보자.

 

 


 

 

1. memcpy

 

메모리를 조작하는 함수로는 대표적으로 memset, memcpy, memmove, memcmp 등이 있다.

 

그 중 memcpy는 메모리를 다른영역으로 복사하는 함수이다.


헤더파일:

  • C : <string.h>
  • C++ : <cstring>

기본 사용 : 

void* memcpy (void* dest, const void* source, size_t num)

dest : 복사받을 곳을 가리키는 포인터

source : 복사할 메모리를 가리키는 포인터

num : 복사할 데이터의 길이 (바이트 단위)

 

- 배열 복사

#include <string.h>

int src[10][10]={0,};
int dist[10][10]={0,};
int main(){
    src[1][1]=10;
    memcpy(dist,src,sizeof(src));
    return 0;
}

주의점 : 

char 형태의 데이터를 복사할 때에는 \0 을 포함해주어야 하기 때문에 size에 +1을 해주어야 한다.

memcpy(dest, src, sizeof(char) * 10 + 1);

 


 

 

2. copy

 

헤더파일 :

  • C++ : <algorithm>

기본 사용 :

OutputIt copy( InputIt first, InputIt last, OutputIt d_first );

first : 복사할 메모리를 가리키는 포인터

last : 복사할 메모리의 마지막을 가리키는 포인터

d_first : 복사받을 메모리를 가리키는 포인터

 

- 1차원 배열 복사 :

copy(src, src + ARR_SIZE, dist);

 

- 2차원 배열 복사 : 

copy(&src[0][0], &src[0][0] + ARR_SIZE * ARR_SIZE, &dist[0][0]);

 

- 벡터 복사 :

src.resize(ARR_SIZE);
copy(src.begin(), src.end(), dist.begin());

 

- 2차원 벡터 복사:

src.resize(ARR_SIZE, vector<int>(ARR_SIZE));
copy(src.begin(), src.end(), dist.begin());

 


 

속도 : 

 

for loop < copy =memcpy

반응형

댓글