CopyDeviceMemory 関数
開発者がデバイス メモリへのアクセス時にアライメント エラーが生成されないようにする必要がある場合、CopyDeviceMemory 関数を使うと、コンパイラの最適化の干渉を受けることなく、ある場所から別の場所にメモリをコピーすることができます。
重要
一部の情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。
パラメーター
パラメーター Destination [out]
コピーしたブロックのコピー先の開始アドレスへのポインター。
パラメーター Source [in]
コピーするメモリ ブロックの開始アドレスへのポインター。
パラメーター Length [in]
コピーするメモリ ブロックのサイズ (バイト単位)。
構文
volatile void*
__cdecl
CopyDeviceMemory (
_Out_writes_bytes_all_(Length) volatile void* Destination,
_In_reads_bytes_(Length) volatile const void* Source,
SIZE_T Length
);
解説
開発者がデバイス メモリへのアクセス時にアライメント エラーが生成されないようにする必要がある場合に、CopyVolatileMemory 動作 (つまり、コンパイラの最適化の干渉を受けることなく、ある場所から別の場所にメモリをコピーする) を提供するためにこの API が存在します。 この API には、次のプロパティがあります。
- API はコンパイラの組み込みとして認識されないため、コンパイラは呼び出しを最適化して削除することはありません (呼び出しを完全に最適化するか、"同等の" 一連の命令に置き換えます)。 これは、さまざまなコンパイラ最適化の対象となる CopyMemory とは異なります。
- 呼び出しが返されると、データは Source から Destination にコピーされます。 この関数の Source と Destination へのメモリ アクセスは、関数内でのみ実行されます (つまり、コンパイラはこの関数からメモリ アクセスを移動できません)。
- CPU がデバイス メモリ上の非整列メモリ アクセスをサポートしている場合にのみ、この API で非整列メモリ アクセスを実行できます。 CPU が非整列デバイス メモリ アクセスをサポートしていない場合は、整列されたアクセスのみが実行されます。
- この API を使うと、コピー操作の一環としてメモリの場所に複数回アクセスできます。
- Source and Destination が重なっている場合のコピー操作はサポートされていません。 重複するバッファーが指定された場合、エラー コード FAST_FAIL_INVALID_ARG でファストフェイルが発生します。
Note
この関数は、デバイス メモリとしてマップされたメモリにアクセスするための CPU の要件が尊重されることのみを保証します。 特定のデバイスにアクセスするための固有の要件がある場合は、この関数を使わないでください (代わりに、開発者は独自のアクセサー関数を実装する必要があります)。 たとえば、この関数は、生成されるメモリ アクセスのサイズについて保証しません (CPU 自体がこのような要件を適用している場合を除きます)。
Note
この関数は、最新バージョンだけではなく、すべてのバージョンの Windows で動作します。 winbase.h
ヘッダーから関数宣言を取得するには、最新の SDK を使用する必要があります。 また、最新の SDK のライブラリ (volatileaccessu.lib
) も必要です。 ただし、生成されたバイナリが正常に実行されるのは、以前のバージョンの Windows です。
例
UCHAR* CopyBuffer;
// In this scenario we are copying data from memory mapped
// as "device memory" (i.e. memory not backed by RAM). On
// some platforms like ARM64, device memory cannot tolerate
// memory accesses that are not naturally aligned (i.e. a 4-byte
// load must be 4-byte aligned). Functions like mempcy, CopyMemory,
// and even CopyVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use CopyDeviceMemory.
CopyDeviceMemory(CopyBuffer, DeviceMemoryBuffer, 100);
要件
サポートされている最小のクライアント: Windows 11 Insider Preview ビルド TBD
ヘッダー: winbase.h (Winbase.h を含む)
カーネル モード ライブラリ: volatileaccessk.lib
ユーザー モード ライブラリ: volatileaccessu.lib