memmove와 memcpy의 차이점은 무엇입니까?
memmove
★★★★★★★★★★★★★★★★★」memcpy
떤떤것 을로 ?떻? 떻? ????
★★★★★★★★★★★★★★★★ memcpy
수신처는, 송신원과 전혀 중복할 수 없습니다.★★★★★★★★★★★★★★★★ memmove
아, 아, 아, 아, 아, 아, 아, 아, 아., ,,memmove
약간 수 있다memcpy
은은가가가가가가기기에에에에에에에 。
를 들어, 「」라고 하는 것은,memcpy
는 항상 주소를 로우에서 하이로 복사할 수 있습니다.송신원 뒤에 행선지가 겹치는 경우는, 카피하기 전에 일부의 주소를 덮어쓰는 것을 의미합니다. memmove
이 경우는, 이것을 검출해, 다른 방향(높은 방향에서 낮은 방향)으로 카피합니다.단, 이 체크박스를 켜고 다른 알고리즘(효율적이지 않을 수 있음)으로 전환하려면 시간이 걸립니다.
양쪽 모두를 실장할 필요가 있다고 가정하면, 실장은 다음과 같이 됩니다.
void memmove ( void * dst, const void * src, size_t count ) {
if ((uintptr_t)src < (uintptr_t)dst) {
// Copy from back to front
} else if ((uintptr_t)dst < (uintptr_t)src) {
// Copy from front to back
}
}
void memcpy ( void * dst, const void * src, size_t count ) {
if ((uintptr_t)src != (uintptr_t)dst) {
// Copy in any way you want
}
}
그리고 이것이 그 차이를 잘 설명해 줄 것이다. memmove
항상 그런 방식으로 복사하고, 만약 그렇다면 여전히 안전할 것이다.src
★★★★★★★★★★★★★★★★★」dst
, '중복'은memcpy
되어 있는 바와 「 」를 사용할 치 않을 뿐입니다.memcpy
, 2개의 메모리 영역이 겹치지 않게 해 주세요.
:의 경우:memcpy
에서 뒤로와 메모리 과 같이 되어 있습니다.
[---- src ----]
[---- dst ---]
복사, ""의 첫 , ""의src
로로 합니다.dst
는 이미 하고 있습니다.src
츠미야[ Back to Front ](앞으로 돌아가다)
, 그럼 바꿔주세요.src
★★★★★★★★★★★★★★★★★」dst
:
[---- dst ----]
[---- src ---]
, 「 back카피하면 「front back」이 「front to back카피하는 합니다.src
첫 번째 바이트를 복사할 때 이미 전면 부근에 있습니다.
.「 「 」memmove
상기의 실장에서는, 실제로 중복하는지를 테스트하는 것도 아니고, 상대적인 위치만 체크할 뿐이지만, 그것만으로 복사는 안전합니다.~로memcpy
에서는 보통 한 한 카피할 수 있는 하고 있습니다.예를 들어, 시스템상의 메모리를 카피할 수 있습니다.memmove
는 보통 같이 됩니다.
void memmove ( void * dst, const void * src, size_t count ) {
if ((uintptr_t)src < (uintptr_t)dst
&& (uintptr_t)src + count > (uintptr_t)dst
) {
// Copy from back to front
} else if ((uintptr_t)dst < (uintptr_t)src
&& (uintptr_t)dst + count > (uintptr_t)src
) {
// Copy from front to back
} else {
// They don't overlap for sure
memcpy(dst, src, count);
}
}
에 따라서는, 에에 sometimes sometimes sometimes sometimes sometimes sometimesmemcpy
back" front "back to front", "back to front", "front", "front"를 복사합니다.memmove
사용할 수도 있습니다.memcpy
중 이지만, 「중요한 경우」는, 「중요한 입니다.memcpy
는 다른 할 수도 어떤 방법으로 복사해야 하는지 에도 마찬가지입니다.따라서 테스트한 경우에도memcpy
시스템에 카피가 있기 때문에, 그 테스트 결과가 항상 정확하다고는 할 수 없습니다.
어떤 전화를 걸어야 할지 결정할 때 어떤 의미가 있습니까?
이 한
src
★★★★★★★★★★★★★★★★★」dst
말고 하세요.memmove
항상 올바른 결과를 얻을 수 있으며 일반적으로 필요한 복사 케이스에서 가능한 한 빨리 결과를 얻을 수 있기 때문입니다.src
★★★★★★★★★★★★★★★★★」dst
말고 하세요.memcpy
그는 양쪽 만, 「어느쪽이든 상관없습니다」, 「어느쪽이든 상관없습니다」, 「어느쪽이든 상관없습니다」,」, 「어느쪽이든 .memmove
않다memcpy
도 있기 에, '우승할 수 은 '우승할 수 있는 것은 '할 수 있는 것은 '할 수 없습니다.memcpy
.
memmove
는 중복되는할 수 .memcpy
수 없다.
고려하다
char[] str = "foo-bar";
memcpy(&str[3],&str[4],4); //might blow up
발신기지와 행선지가 겹치는 것은 명백합니다.「-bar」를 「bar」로 덮어씁니다.은 동작입니다memcpy
는, 이는 「」, 「」, 「」가 필요합니다.memmove
.
memmove(&str[3],&str[4],4); //fine
memcpy man 페이지에서.
memcpy() 함수는 메모리 영역 src에서 메모리 영역 수신처에n 바이트를 복사합니다.메모리 영역이 겹치지 않도록 합니다.메모리 영역이 겹치는 경우는, memmove(3)를 사용합니다.
ISO/IEC:9899 표준에 따라 쉽게 설명됩니다.
7.21.2.1memcpy 함수
[...]
2 memcpy 함수는 s2가 가리키는 오브젝트에서 s1이 가리키는 오브젝트로 n개의 문자를 복사합니다.중복되는 객체 간에 복사가 이루어지는 경우 동작은 정의되지 않습니다.
그리고.
7.21.2.2memmove 함수
[...]
2 memmove 함수는 s2가 가리키는 오브젝트에서 s1이 가리키는 오브젝트로 n개의 문자를 복사합니다.복사는 s2가 가리키는 오브젝트로부터의 n문자를 s1과 s2가 가리키는 오브젝트와 겹치지 않는 n문자의 임시배열로 먼저 복사한 후 s1이 가리키는 오브젝트로 복사한다.
질문에 따라 어떤 것을 주로 사용하는지는 필요한 기능에 따라 달라집니다.
텍스트로 통통 in in in in in in inmemcpy()
하지 않다s1
★★★★★★★★★★★★★★★★★」s2
memmove()
「 」의 주된 memmove()
★★★★★★★★★★★★★★★★★」memcpy()
이이에 있어요?memmove()
버퍼(일시 메모리)가 사용되므로 중복될 위험이 없습니다.반면에,memcpy()
는, 송신원이 가리키는 로케이션으로부터 수신처가 가리키는 로케이션에 데이터를 직접 카피합니다.(http://www.cplusplus.com/reference/cstring/memcpy/)
다음 예를 생각해 보겠습니다.
#include <stdio.h> #include <string.h> int main (void) { char string [] = "stackoverflow"; char *first, *second; first = string; second = string; puts(string); memcpy(first+5, first, 5); puts(first); memmove(second+5, second, 5); puts(second); return 0; }
예상대로, 다음과 같이 인쇄됩니다.
stackoverflow stackstacklow stackstacklow
그러나 이 예에서는 결과가 같지 않습니다.
#include <stdio.h> #include <string.h> int main (void) { char string [] = "stackoverflow"; char *third, *fourth; third = string; fourth = string; puts(string); memcpy(third+5, third, 7); puts(third); memmove(fourth+5, fourth, 7); puts(fourth); return 0; }
출력:
stackoverflow stackstackovw stackstackstw
이는 "memcpy()"가 다음을 수행하기 때문입니다.
1. stackoverflow
2. stacksverflow
3. stacksterflow
4. stackstarflow
5. stackstacflow
6. stackstacklow
7. stackstacksow
8. stackstackstw
한 실행 .mempcpy(void *dest, const void *src, size_t n)
(그냥)
for (char *p=src, *q=dest; n-->0; ++p, ++q) *q=*p;
char *p=src, *q=dest; while (n-->0) q[n]=p[n];
첫 번째 구현에서는 복사가 낮은 주소에서 높은 주소로 진행되며 두 번째 구현에서는 높은 주소에서 낮은 주소로 진행됩니다.복사하는 범위가 겹치면(예를 들어 프레임버퍼 스크롤 시 등), 동작의 한쪽 방향만 올바르고 다른 한쪽 방향은 나중에 읽을 위치를 덮어씁니다.
A memmove()
합니다.dest<src
및 (플랫폼에 의존한)의 합니다.memcpy()
.
유저 는 그렇게 수 .을 하고 . 왜냐하면 캐스팅 후에도src
★★★★★★★★★★★★★★★★★」dst
일부 구체적인 포인터 유형에서는 (일반적으로) 동일한 객체를 가리키지 않기 때문에 비교할 수 없습니다.그러나 표준 라이브러리는 정의되지 않은 동작을 일으키지 않고 이러한 비교를 수행할 수 있는 충분한 플랫폼 지식을 가지고 있습니다.
실생활에서는, 대규모 전송(어라인먼트가 허가하는 경우)이나 데이터 캐쉬의 사용율이 뛰어난 것으로부터 최대의 퍼포먼스를 얻기 위해서, 실장은 큰폭으로 복잡해지는 경향이 있습니다.위의 코드는 요점을 가능한 한 간단하게 하기 위한 것입니다.
나)memmove
다른(「」, 「」, 「」)를 합니다.memcpy
에서는 그렇지 않습니다.
memmove는 중복되는 소스 영역과 수신처 영역을 처리할 수 있지만 memcpy는 처리할 수 없습니다.둘 중 memcpy가 훨씬 효율적입니다.그래서 가능하면 memcpy를 사용하는 것이 좋습니다.
참고 자료: https://www.youtube.com/watch?v=Yr1YnOVG-4g Dr. Jerry Cain, (Stanford Intro Systems 강의 - 7) 시간:
언급URL : https://stackoverflow.com/questions/1201319/what-is-the-difference-between-memmove-and-memcpy
'sourcecode' 카테고리의 다른 글
각 루프에 비동기/대기 사용 (0) | 2022.11.17 |
---|---|
mariadb 5.5에서10으로 업그레이드/업데이트 (0) | 2022.11.17 |
XAMPP/Apache 서비스 파일을 htdocs 폴더 외부에 만듭니다. (0) | 2022.11.17 |
바닐라 JavaScript를 사용하여 div의 폭을 구하는 방법은 무엇입니까? (0) | 2022.11.17 |
CodeIgniter: 새 도우미를 생성하시겠습니까? (0) | 2022.11.17 |