std:: memcpy
|
헤더 파일에 정의됨
<cstring>
|
||
|
void
*
memcpy
(
void
*
dest,
const
void
*
src,
std::
size_t
count
)
;
|
||
다음 작업을 순서대로 수행합니다:
- 암시적으로 생성 합니다. dest 에 객체를
- 복사합니다 count 개의 문자를 ( unsigned char 타입처럼) src 가 가리키는 객체에서 dest 가 가리키는 객체로
다음 조건 중 하나라도 충족되면, 동작은 정의되지 않습니다:
- dest 또는 src 가 널 포인터 또는 유효하지 않은 포인터 인 경우.
- 객체 간 복사가 중첩된 영역에서 발생하는 경우.
목차 |
매개변수
| 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 멤버 함수)
|
|
|
(C++11)
|
요소 범위를 새로운 위치로 복사
(함수 템플릿) |
|
요소 범위를 역순으로 복사
(함수 템플릿) |
|
|
(C++11)
|
타입이 trivially copyable인지 확인
(클래스 템플릿) |
|
C 문서
for
memcpy
|
|