개발자_이훈규
천천히, 빠르게. 개발자의 Repository
개발자_이훈규
전체 방문자
오늘
어제
  • 분류 전체보기 (473)
    • 티스토리 (4)
    • 개발자 뉴스 (2)
    • 소프트웨어 (203)
      • C (7)
      • c++ (25)
      • Objective-C (3)
      • Do it! 반응형 웹디자인 (4)
      • openGL (8)
      • Java (24)
      • Jni (3)
      • Android (9)
      • Wordpress (2)
      • 버그 만난 후 느낀점 (2)
      • Git (3)
      • node js (2)
      • window tablet (1)
      • HTML (3)
      • javascript (3)
      • perl (1)
      • AngularJS (0)
      • JSON (0)
      • Docker (3)
      • python (5)
      • jQuery (1)
      • MFC (4)
      • cocos studio (6)
      • Golang (1)
      • SQLite3 (0)
      • Spring Boot (8)
      • thymeleaf (0)
      • Django (0)
      • iOS (3)
      • skia (0)
      • VBA (0)
      • PHP (2)
      • Oracle (1)
      • JSP (0)
      • R (0)
    • TCP IP (2)
    • 금융 (0)
      • 금융 Study (0)
      • 금융 Archive (0)
      • 금융 Article (0)
    • 개인 프로젝트 (7)
      • gif 홈페이지 만들기 (0)
      • study app만들기 (0)
      • 크롤러 만들기 (1)
      • 카툰 홈페이지 만들기 (1)
      • 외주 홈페이지 만들기 (3)
      • 웹 홈페이지 만들기 (0)
      • 미디어 서버 만들기 (0)
      • 소개팅 어플 만들기 (0)
      • 인스타그램 풀스택 클론 코딩(인강 노트) (0)
      • 주식 모의거래 만들기 (1)
    • html php mysql (0)
    • node.Js (2)
    • 일상 (2)
    • 빈공간 uml 공부 (0)
    • Ubuntu(linux) (12)
    • 맥OS (10)
      • android 설치하기 (2)
    • Programming quizzes (0)
    • IoT (구 유비쿼터스) (16)
      • 라즈베리 파이 (11)
      • 아두이노 (5)
    • 하드웨어 (5)
      • 아수스 비보탭 노트8 asus vivotap no.. (2)
      • 크레마 카르타 (3)
    • 분석할 문장, 구문, 코드 (0)
    • 키보드 (1)
      • 해피해킹 (1)
    • 코드 라이언 (0)
    • 전자기기 (4)
    • Ted (0)
    • NAS (0)
    • 알고리즘 (0)
    • 연합인포맥스 (0)
    • 이벤트 응모함 (4)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 개발
  • 설명
  • 예제
  • 방법
  • error
  • 설치
  • CODE
  • Python
  • 에러
  • C++
  • 소스
  • C
  • 코드
  • 우분투
  • Example
  • Java
  • GIT
  • install
  • ubuntu
  • 라즈베리 파이

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
개발자_이훈규

천천히, 빠르게. 개발자의 Repository

카테고리 없음

c++ / 6. memcpy에 대해서 실험해봤습니다.

2014. 9. 18. 02:13

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에 대해서 실험해봤습니다. 끝.

저작자표시 비영리 (새창열림)
    개발자_이훈규
    개발자_이훈규
    혼자 꽁양꽁양 개발하면서 놀아요~ - 노트같은 블로그

    티스토리툴바