次の方法で共有


FillDeviceMemory 関数

FillDeviceMemory 関数は、開発者がデバイス メモリへのアクセス時にアライメント エラーが生成されないようにする必要がある場合、コンパイラの最適化の干渉を受けることなく、バッファーの内容を設定します。

重要

一部の情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。

パラメーター

パラメーター Destination [out]

充填されるメモリ ブロックの開始アドレスへのポインター。

パラメーター Length [in]

充填されるメモリのブロックのサイズ (バイト単位)。 この値は、Destination バッファーのサイズより小さくする必要があります。

パラメーター Fill [in]

メモリ ブロックを充填するバイト値。

構文

volatile void*
  FillDeviceMemory (
    _Out_writes_bytes_all_(Length) volatile void* Destination,
    SIZE_T Length,
    INT Fill
  );

解説

この API は、開発者がデバイス メモリへのアクセス時にアライメント エラーが生成されないようにする必要がある場合に、FillVolatileMemory 動作 (つまり、コンパイラの最適化による干渉を受けずにバッファーの内容を設定する) を提供するために存在します。 この API には、次のプロパティがあります。

  • API はコンパイラの組み込みとして認識されないため、コンパイラは呼び出しを最適化して削除することはありません (呼び出しを完全に最適化するか、"同等の" 一連の命令に置き換えます)。 これは、さまざまなコンパイラ最適化の対象となる FillMemory とは異なります。
  • 呼び出しが完了すると、バッファーは目的の値で上書きされています。 この関数の Destination へのメモリ アクセスは、関数内でのみ実行されます (つまり、コンパイラはメモリ アクセスをこの関数の外に移動できません)。
  • CPU がデバイス メモリ上で整列されていないメモリ アクセスをサポートしている場合にのみ、API は整列されていないメモリ アクセスを実行することがあります。 CPU が整列されていないデバイス メモリ アクセスをサポートしていない場合は、整列されたアクセスのみが実行されます。
  • この API は、操作の一環としてメモリ位置に複数回アクセスする場合があります。

Note

この関数では、デバイス メモリとしてマップされたメモリにアクセスするための CPU の要件が順守されることのみが保証されます。 特定のデバイスにアクセスするための固有の要件がある場合は、この関数を使わないでください (代わりに、開発者は独自のアクセサー関数を実装する必要があります)。 たとえば、この関数は、生成されるメモリ アクセスのサイズについて保証しません (CPU 自体がこのような要件を適用している場合を除きます)。

Note

この関数は、最新バージョンだけではなく、すべてのバージョンの Windows で動作します。 winbase.h ヘッダーから関数宣言を取得するには、最新の SDK を使う必要があります。 また、最新の SDK のライブラリ (volatileaccessu.lib) も必要です。 ですが、生成されたバイナリは、以前のバージョンの Windows でも問題なく動作します。

// In this scenario we are setting data on 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 memset, FillMemory,
// and even FillVolatileMemory may perform unaligned memory accesses
// because it is typically faster to do this.
// To ensure only naturally aligned accesses happen, use FillDeviceMemory.

FillDeviceMemory(DeviceMemoryBuffer, 100, 0xAA);

要件

サポートされている最小のクライアント: Windows 11 Insider Preview ビルド TBD

ヘッダー: winbase.h (Winbase.h を含む)

カーネル モード ライブラリ: volatileaccessk.lib

ユーザー モード ライブラリ: volatileaccessu.lib

関連項目