2011-05-04 3 views
1

가능한 중복 :
memcpy vs memmovememmove는 실제로 메모리 덩어리를 "이동"하고 소스에 0을 남겨 둡니까?

memmove 실제로 "이동"메모리 청크를합니까? 그렇다면 메모리가 0으로 유지됩니까? 아니면 memcpy과 같은 것입니까? 맨 페이지를보고 있는데, 내 가정이 맞다고 생각하지 않습니다. memmove를 사용하여 메모리 덩어리를 이동하려는 경우 이동을 수행 한 메모리 덩어리를 수동으로 제로화해야합니까?

답변

3

그렇진 :

memmovememcpy의 주요 차이점은 memmove 당신이 이동하려는 메모리 블록을 겹쳐 어딘가에 기억의 조각을 재배치하는 데 사용할 수 있다는 것입니다. 따라서 원래 포인터는 더 이상 유효하지 않습니다.

memcpy을 사용하면 두 영역을 겹칠 수 없습니다.

memmove 원래 메모리 블록을 0으로 만들지 않습니다. 그렇게하고 싶다면 memset으로 직접 명시해야합니다. 일반적으로 C 루틴은 메모리를 비우는 것과 같이 필요하지 않을 수있는 일을하는 사이클을 낭비하지 않습니다. 비슷한 메모리 블록을 0으로하지 않는 malloc과 비교하십시오.

+0

그러나 일반화 할 때는주의해야합니다. calloc()은 메모리를 제로로 처리합니다. (참고 : 이것은 tylerl의 답을 노크하는 것이 아니라 C가 많은 특이성을 가지고 있다고 경고합니다 .C++도 마찬가지입니다.) –

4

memmove은 이전 메모리를 지우는 것과 아무런 관련이 없습니다. 사실 memmove을 사용하려는 유일한 상황에서 이전 메모리를 삭제하면 방금 복사 한 데이터가 파괴됩니다! memmove은 소스와 대상 범위가 겹칠 것으로 예상 할 때만 유용합니다.

일반적으로 memmove이 필요하다고 판단되면 디자인에 근본적인 비 효율성이 있음을 나타냅니다. 예를 들어, 종종 새로운 C 프로그래머는 s+1 또는 &s[1]을 사용하여 문자열의 꼬리를 해결하기보다는 memmove을 사용하여 문자열의 처음 몇 문자 (예 : memmove(s, &s[1], len))를 제거하려고 시도합니다. memmove을 포함하는 알고리즘은 O (n^2)보다 성능이 좋지 않습니다.

관련 문제