CopyDeviceMemory, fonction

La fonction CopyDeviceMemory copie la mémoire d’un emplacement vers un autre sans interférence des optimisations du compilateur dans les situations où le développeur doit également être sûr que des erreurs d’alignement ne seront pas générées lors de l’accès à la mémoire de l’appareil.

Important

Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifié avant sa commercialisation. Microsoft n’offre aucune garantie, expresse ou implicite, concernant les informations fournies ici.

Paramètres

Paramètre Destination [out]

Pointeur vers l’adresse de début de la destination du bloc copié.

Paramètre Source [in]

Pointeur vers l’adresse de début du bloc de mémoire à copier.

Paramètre Length [in]

Taille du bloc de mémoire à copier, en octets.

Syntaxe

volatile void*
  __cdecl
  CopyDeviceMemory (
    _Out_writes_bytes_all_(Length) volatile void* Destination,
    _In_reads_bytes_(Length) volatile const void* Source,
    SIZE_T Length
  );

Notes

Cette API est destinée à fournir le comportement de CopyVolatileMemory (c’est-à-dire copier la mémoire d’un emplacement vers un autre sans interférence des optimisations du compilateur) dans les situations où le développeur doit également être sûr que des erreurs d’alignement ne seront pas générées lors de l’accès à la mémoire de l’appareil. L’API a les propriétés suivantes :

  • L’API n’est pas reconnue comme étant intrinsèque au compilateur ; celui-ci n’optimise donc jamais l’appel (entièrement ou en remplaçant l’appel par une séquence d’instructions « équivalente »). Ceci diffère de CopyMemory, qui est soumis à diverses optimisations du compilateur.
  • Quand l’appel retourne, les données ont été copiées de la Source vers la Destination. Ces accès mémoire des fonctions à la Source et à la Destination seront effectués seulement au sein de la fonction (autrement dit, le compilateur ne peut pas déplacer les accès mémoire en dehors de cette fonction).
  • L’API peut effectuer des accès mémoire non alignés seulement si le processeur prend en charge les accès mémoire non alignés sur la mémoire de l’appareil. Si le processeur ne prend pas en charge les accès non alignés à la mémoire des appareils, seuls les accès alignés sont effectués.
  • L’API peut accéder plusieurs fois à des emplacements mémoire dans le cadre de son opération de copie.
  • Ne prend pas en charge les opérations de copie lorsque la Source et la Destination se chevauchent. Si des mémoires tampons qui se chevauchent sont fournies, une interruption immédiate se produit avec le code d’erreur d’erreur FAST_FAIL_INVALID_ARG.

Remarque

Cette fonction garantit seulement que les exigences du processeur pour accéder à la mémoire mappée en tant que mémoire de l’appareil sont respectées. Si un appareil spécifique a ses propres exigences spécifiques pour l’accès, cette fonction ne doit pas être utilisée (et au lieu de cela, le développeur doit implémenter ses propres fonctions d’accesseur). Par exemple, cette fonction ne garantit pas la taille des accès mémoire générés (sauf si le processeur lui-même applique ces exigences).

Remarque

Cette fonction fonctionne sur toutes les versions de Windows, pas seulement sur la dernière. Vous devez utiliser le SDK le plus récent pour obtenir la déclaration de fonction de l’en-tête winbase.h. Vous avez également besoin de la bibliothèque (volatileaccessu.lib) du SDK le plus récent. Cependant, le fichier binaire résultant s’exécutera correctement sur les versions antérieures de Windows.

Exemple

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);

Spécifications

Client minimal pris en charge : Windows 11 Insider Preview Build TBD

En-tête : winbase.h (include Winbase.h)

Bibliothèque en mode noyau : volatileaccessk.lib

Bibliothèque en mode utilisateur : volatileaccessu.lib

Voir aussi