@memcpy — 메모리 영역을 다른 영역으로 복사하기

@memcpy — 메모리 영역을 다른 영역으로 복사하기

한 메모리에 담긴 내용을 통째로 다른 메모리로 옮기고 싶을 때가 있어요. 일일이 원소를 순회하며 대입할 수도 있지만, 바이트를 그대로 복사해 주는 내장 함수가 따로 있어요. 바로 @memcpy입니다. 한 메모리 영역(region)의 바이트를 다른 메모리 영역으로 복사해 주는 함수죠.

출처: Zig Documentation

본문

시그니처는 이렇게 생겼어요.

@memcpy(noalias dest, noalias source) void

dest붙여 쓸 수 있는(mutable) 대상이어야 해요. 구체적으로는 mutable 슬라이스(slice), mutable 배열 포인터, mutable many-item 포인터 중 하나면 되고, 정렬(alignment)이나 원소 타입은 어떤 것이든 상관없어요. source는 슬라이스, 배열 포인터, many-item 포인터 중 하나면 되고, 역시 정렬이나 원소 타입은 자유롭습니다.

source의 원소 타입은 dest의 원소 타입과 메모리상 표현(in-memory representation)이 같아야 해요. 그리고 for 루프와 비슷하게, sourcedest 중 적어도 하나는 길이(length)를 제공해야 해요. 둘 다 길이를 제공한다면 두 길이는 반드시 같아야 합니다.

마지막으로 중요한 제약이 하나 있어요. 두 메모리 영역은 겹치면 안 됩니다. destsource가 같은 바이트 영역을 가리키며 복사하는 상황은 허용되지 않아요. 겹치는 영역을 다뤄야 한다면 @memmove를 써야 합니다.

더 알아보기 (Learn more)

  • 메모리 영역을 특정 값으로 채우려면 @memset
  • 서로 겹치는 메모리 영역을 안전하게 복사하려면 @memmove
  • 민감한 내용을 메모리에서 안전하게 지우려면 std.crypto.secureZero를 사용해요.