Namespaces
Variants

std:: memcpy

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

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

  1. 암시적으로 생성 합니다. dest 에 객체를
  2. 복사합니다 count 개의 문자를 ( unsigned char 타입처럼) src 가 가리키는 객체에서 dest 가 가리키는 객체로

다음 조건 중 하나라도 충족되면, 동작은 정의되지 않습니다:

목차

매개변수

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

반환값

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

참고 사항

std::memcpy 는 메모리 간 복사를 위한 가장 빠른 라이브러리 루틴으로 설계되었습니다. 일반적으로 복사할 데이터를 스캔해야 하는 std::strcpy 나 중첩된 입력을 처리하기 위한 예방 조치를 취해야 하는 std::memmove 보다 더 효율적입니다.

여러 C++ 컴파일러들이 적절한 메모리 복사 루프를 std::memcpy 호출로 변환합니다.

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

예제

#include <cstdint>
#include <cstring>
#include <iostream>
int main()
{
    // 간단한 사용법
    char source[] = "once upon a daydream...", dest[4];
    std::memcpy(dest, source, sizeof dest);
    std::cout << "dest[4] = {";
    for (int n{}; char c : dest)
        std::cout << (n++ ? ", " : "") << '\'' << c << "'";
    std::cout << "};\n";
    // 재해석
    double d = 0.1;
//  std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // aliasing violation
    std::int64_t n;
    std::memcpy(&n, &d, sizeof d); // OK
    std::cout << std::hexfloat << d << " is " << std::hex << n
              << " as a std::int64_t\n" << std::dec;
    // 대상 버퍼에서 객체 생성
    struct S
    {
        int x{42};
        void print() const { std::cout << '{' << x << "}\n"; }
    } s;
    alignas(S) char buf[sizeof(S)];
    S* ps = new (buf) S; // placement new
    std::memcpy(ps, &s, sizeof s);
    ps->print();
}

출력:

dest[4] = {'o', 'n', 'c', 'e'};
0x1.999999999999ap-4 is 3fb999999999999a as a std::int64_t
{42}

결함 보고서

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

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

참고 항목

버퍼를 다른 버퍼로 이동
(함수)
버퍼를 문자로 채움
(함수)
두 개의 겹치지 않는 배열 사이에서 지정된 양의 와이드 문자를 복사
(함수)
문자 복사
( std::basic_string<CharT,Traits,Allocator> 의 public 멤버 함수)
요소 범위를 새로운 위치로 복사
(함수 템플릿)
요소 범위를 역순으로 복사
(함수 템플릿)
타입이 trivially copyable인지 확인
(클래스 템플릿)
C 문서 for memcpy