c++ / 6. memcpy에 대해서 실험해봤습니다.
memcpy나 mem의 함수에 대해서 많이 모르기 때문에 설명서를 읽고 실습을 해보기록 했습니다.
memcpy는 복사를 하는 함수인데, 단순히 드는 궁금증. 복사를 할 때 크기가 서로 다르거나 하면 어떻게 되지??
그래서 바로 vim을 열고 테스트 코드를 작성해봤습니다.
총 테스트는 2가지입니다.
기본 구조는 int 1개, int array1개이고,
첫번째 실험은 int에 값을 준 후, array에 한번은 부족하게, 다른 한번은 넉넉하게 값을 준 경우입니다.
두번째 실험은 array에 값을 가득 채운 후, int에 값을 주는 경우입니다.
( 값이 채워지는 것을 보기 위해서 초기화는 1로 했습니다.)
결과는 아래와 같이 나왔습니다.
첫번째 실험은 별다른 변화가 없지만 두번째 실험은 관심있게 봐야할것 같군요.
SET b[0] = 5 b[1] = 16843009 SET b[0] = 5 b[1] = 16843009 SET a = 1 SET a = 2 |
한번 두번째 경우에 대해서 상상을 해보겠습니다.
이 컴퓨터가 리틀 엔디안이라 가정하면
|0|---2--- |1| --- 1 ---| 으로 값이 채워져 있고, 첫번째는 sizeof(int)*2 만큼 복사하라는 명령을 했으니 2칸만큼 복사를 할 것이다. 하지만 int 1개만큼이 존재하니 덮어씌워지는 식으로 중복실행이 될 것입니다.
따라서 마지막인 1이 덮어 씌워지고,
sizeof(int)만큼 복사를 하게되면 단순히 2만 씌워진 후에 끝났을 것입니다.
이 가정을 신뢰하기 위해서 실험을 준비해봤습니다.
이번엔 int[2]와 int[3]을 두고, int[3]에 값을 할당한 다음 int[2]에 넣는 실험으로 코드는 아래와 같습니다.
결과는 아래와 같이 나왔는데, b의 값을 a에 복사할 때 스택에 담긴 대로 메모리를 침범(?)한것을 볼 수 있습니다.
따라서 memcpy를 하게 되면 주어진 범위만큼을 메모리 카피로 채워버리게 되는 것입니다.
SET b[0]=1 b[1]=2 b[2]=3 a[0] = 1 a[1] = 0 SET b[0]=1 b[1]=2 b[2]=3 a[0] = 1 a[1] = 2 SET b[0]=3 b[1]=2 b[2]=3 a[0] = 1 a[1] = 2 |
뭔가 리틀 엔디안과 여러가지 이야기가 나왔지만, 메모리를 찍어보는 실험을 하면 좀더 정확해질것 같은데 그건 생각하고 하려면 시간이 많이 걸리므로 패스하고~
일단 memcpy을 사용하면 메모리를 복사 후 over writing이 될 수 있다는 사실.
아, 이걸 정리하다가 혹시나 해서 본 memcpy의 설명에 이런 문구가 있네요,
The memory areas must not overlap.
뭔가 위의 실험들이 강한 삽질의 기운으로 다가오지만 이쯤에서 마무리를 지으면서~!
열심히 코딩을 재미나게 해보겠습니다ㅎㅎ
감사합니다.
c++ / 6. memcpy에 대해서 실험해봤습니다. 끝.