Namespaces
Variants

std:: memmove

From cppreference.net
헤더 파일에 정의됨 <cstring>
void * memmove ( void * dest, const void * src, std:: size_t count ) ;

다음 작업을 순서대로 수행합니다:

  1. 암시적으로 생성 합니다 dest 에 객체를.
  2. 복사합니다 count 개의 문자를 (마치 unsigned char 타입인 것처럼, 이하 동일) src 가 가리키는 객체로부터 임시 배열 arr 로, 여기서 arr dest src 가 가리키는 객체와 겹치지 않습니다.
  3. 복사합니다 count 개의 문자를 arr 에서 dest 가 가리키는 객체로.

만약 dest 또는 src null 포인터 또는 유효하지 않은 포인터 인 경우, 동작은 정의되지 않습니다.

목차

매개변수

dest - 복사할 메모리 위치를 가리키는 포인터
src - 복사할 원본 메모리 위치를 가리키는 포인터
count - 복사할 바이트 수

반환값

적합한 생성된 객체가 있으면 해당 객체에 대한 포인터를 반환하고, 그렇지 않으면 dest 를 반환합니다.

참고 사항

명세에서는 임시 버퍼가 사용된다고 명시되어 있지만, 이 함수의 실제 구현에서는 이중 복사나 추가 메모리 오버헤드가 발생하지 않습니다. 작은 count 의 경우 레지스터를 로드하고 기록할 수 있으며, 더 큰 블록의 경우 (glibc 및 bsd libc에서) 일반적인 접근 방식은 대상이 소스보다 먼저 시작하는 경우 버퍼의 시작부터 순방향으로 바이트를 복사하고, 그렇지 않은 경우 끝에서 역방향으로 복사하며, 전혀 겹치는 부분이 없을 때는 std::memcpy 로 폴백합니다.

strict aliasing 이 동일한 메모리를 서로 다른 두 타입의 값으로 검사하는 것을 금지하는 경우, std::memmove 를 사용하여 값을 변환할 수 있습니다.

예제

#include <cstring>
#include <iostream>
int main()
{
    char str[] = "1234567890";
    std::cout << str << '\n';
    std::memmove(str + 4, str + 3, 3); // [4, 5, 6]에서 [5, 6, 7]로 복사
    std::cout << str << '\n';
}

출력:

1234567890
1234456890

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 4064 C++98 반환된 포인터가 적절히 생성된 객체를 가리키는지 불분명했음 명확히 규정됨

참고 항목

한 버퍼를 다른 버퍼로 복사합니다
(함수)
버퍼를 문자로 채웁니다
(함수)
두 개의 (겹칠 수 있는) 배열 사이에서 지정된 개수의 와이드 문자를 복사합니다
(함수)
요소들의 범위를 새로운 위치로 복사합니다
(함수 템플릿)
요소들의 범위를 역순으로 복사합니다
(함수 템플릿)
타입이 트리비얼하게 복사 가능한지 확인합니다
(클래스 템플릿)
C 문서 for memmove