UnsafeUtility.MemMove
Declaration
public static void MemMove(void* destination, void* source, long size);Параметры
| Параметр | Описание |
|---|---|
| место назначения | Указатель на начало блока памяти назначения. Убедитесь, что этот блок достаточно большой, чтобы вместить указанное количество байт, чтобы предотвратить переполнение. |
| источник | Указатель на начало блока исходной памяти. Этот блок содержит данные, подлежащие перемещению, и должен быть действительным для всего размера операции перемещения. |
| размер | Число байтов, которые должны быть перенесены из источника в назначение. Это значение должно быть положительным и меньше или равно размерам обоих блоков памяти. |
Описание
Копирует указанное количество байтов из расположения исходной памяти в место назначения, допуская перекрывающиеся области.
Метод MemMove предназначен для перемещения блока памяти из одного места в другое. В отличие от стандартных операций копирования памяти, MemMove может безопасно обрабатывать перекрывающиеся области памяти, обеспечивая правильную передачу данных, даже когда области источника и назначения перекрываются.
Эта функция необходима в сценариях, когда области памяти могут перекрываться, например, перемещающиеся элементы в массиве или буфере. Будьте осторожны при использовании этой функции, чтобы убедиться, что оба указателя действительны и что в блоке назначения достаточно места для размещения перемещаемой памяти.
using UnityEngine; using Unity.Collections.LowLevel.Unsafe;
public class MemMoveOverlapExample : MonoBehaviour { void Start() { int numElements = 10;
// Allocate a buffer using stackalloc with space for 20 elements unsafe { byte* buffer = stackalloc byte[numElements * 2];
// Initialize the buffer with initial values for (int i = 0; i < numElements; i++) { buffer[i] = (byte)(i + 1); // Fills buffer with values 1 to 10 }
Debug.Log("Buffer before MemMove:"); for (int i = 0; i < numElements * 2; i++) { Debug.Log(buffer[i]); }
// Perform a MemMove operation to simulate overlapping memory move // Move the first 10 bytes (1 to 10) to the next starting position (5) UnsafeUtility.MemMove(buffer + 5, buffer, numElements);
Debug.Log("Buffer after MemMove:"); for (int i = 0; i < numElements * 2; i++) { Debug.Log(buffer[i]); } } } }
Дополнительные ресурсы: ,UnsafeUtility.MemCpy,, ,UnsafeUtility.MemCpyStride,.