가능한 중복 :
memcpy vs memmovememmove는 실제로 메모리 덩어리를 "이동"하고 소스에 0을 남겨 둡니까?
memmove 실제로 "이동"메모리 청크를합니까? 그렇다면 메모리가 0으로 유지됩니까? 아니면 memcpy과 같은 것입니까? 맨 페이지를보고 있는데, 내 가정이 맞다고 생각하지 않습니다. memmove를 사용하여 메모리 덩어리를 이동하려는 경우 이동을 수행 한 메모리 덩어리를 수동으로 제로화해야합니까?
가능한 중복 :
memcpy vs memmovememmove는 실제로 메모리 덩어리를 "이동"하고 소스에 0을 남겨 둡니까?
memmove 실제로 "이동"메모리 청크를합니까? 그렇다면 메모리가 0으로 유지됩니까? 아니면 memcpy과 같은 것입니까? 맨 페이지를보고 있는데, 내 가정이 맞다고 생각하지 않습니다. memmove를 사용하여 메모리 덩어리를 이동하려는 경우 이동을 수행 한 메모리 덩어리를 수동으로 제로화해야합니까?
그렇진 :
이memmove
과 memcpy
의 주요 차이점은 memmove
당신이 이동하려는 메모리 블록을 겹쳐 어딘가에 기억의 조각을 재배치하는 데 사용할 수 있다는 것입니다. 따라서 원래 포인터는 더 이상 유효하지 않습니다.
memcpy
을 사용하면 두 영역을 겹칠 수 없습니다.
memmove
원래 메모리 블록을 0으로 만들지 않습니다. 그렇게하고 싶다면 memset으로 직접 명시해야합니다. 일반적으로 C 루틴은 메모리를 비우는 것과 같이 필요하지 않을 수있는 일을하는 사이클을 낭비하지 않습니다. 비슷한 메모리 블록을 0으로하지 않는 malloc
과 비교하십시오.
memmove
은 이전 메모리를 지우는 것과 아무런 관련이 없습니다. 사실 memmove
을 사용하려는 유일한 상황에서 이전 메모리를 삭제하면 방금 복사 한 데이터가 파괴됩니다! memmove
은 소스와 대상 범위가 겹칠 것으로 예상 할 때만 유용합니다.
일반적으로 memmove
이 필요하다고 판단되면 디자인에 근본적인 비 효율성이 있음을 나타냅니다. 예를 들어, 종종 새로운 C 프로그래머는 s+1
또는 &s[1]
을 사용하여 문자열의 꼬리를 해결하기보다는 memmove
을 사용하여 문자열의 처음 몇 문자 (예 : memmove(s, &s[1], len)
)를 제거하려고 시도합니다. memmove
을 포함하는 알고리즘은 O (n^2)보다 성능이 좋지 않습니다.
그러나 일반화 할 때는주의해야합니다. calloc()은 메모리를 제로로 처리합니다. (참고 : 이것은 tylerl의 답을 노크하는 것이 아니라 C가 많은 특이성을 가지고 있다고 경고합니다 .C++도 마찬가지입니다.) –