sourcecode

memmove와 memcpy의 차이점은 무엇입니까?

copyscript 2022. 11. 17. 21:21
반응형

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시스템에 카피가 있기 때문에, 그 테스트 결과가 항상 정확하다고는 할 수 없습니다.

어떤 전화를 걸어야 할지 결정할 때 어떤 의미가 있습니까?

  1. 이 한src ★★★★★★★★★★★★★★★★★」dst말고 하세요.memmove항상 올바른 결과를 얻을 수 있으며 일반적으로 필요한 복사 케이스에서 가능한 한 빨리 결과를 얻을 수 있기 때문입니다.

  2. 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 ★★★★★★★★★★★★★★★★★」s2memmove()

「 」의 주된 memmove() ★★★★★★★★★★★★★★★★★」memcpy() 이이에 있어요?memmove()버퍼(일시 메모리)가 사용되므로 중복될 위험이 없습니다.반면에,memcpy()는, 송신원이 가리키는 로케이션으로부터 수신처가 가리키는 로케이션에 데이터를 직접 카피합니다.(http://www.cplusplus.com/reference/cstring/memcpy/)

다음 예를 생각해 보겠습니다.

  1. #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
    
  2. 그러나 이 예에서는 결과가 같지 않습니다.

    #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)(그냥)

  1. for (char *p=src, *q=dest;  n-->0;  ++p, ++q)
        *q=*p;
    
  2. 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

반응형