196 votes

Utilisation pratique du mot-clé `stackalloc`.

Est-ce que quelqu'un a déjà utilisé stackalloc en programmant en C# ? Je suis conscient de ce qu'il fait, mais la seule fois où il apparaît dans mon code est par accident, parce qu'Intellisense le suggère lorsque je commence à taper. static par exemple.

Bien qu'elle ne soit pas liée aux scénarios d'utilisation de la stackalloc En fait, je fais une quantité considérable d'interopérabilité avec les applications patrimoniales dans mes applications. unsafe code. Mais néanmoins, je trouve généralement des moyens d'éviter unsafe complètement.

Et comme la taille de la pile pour un seul thread dans .Net est de ~1Mb (corrigez-moi si je me trompe), je suis encore plus réservé à l'utilisation de stackalloc .

Y a-t-il des cas pratiques où l'on pourrait dire : "c'est exactement la bonne quantité de données et de traitement pour que je puisse aller dans le danger et utiliser". stackalloc " ?

10 votes

Je viens de remarquer que System.Numbers l'utilise beaucoup referencesource.microsoft.com/#mscorlib/system/

9voto

fjch1997 Points 949

Il y a d'excellentes réponses à cette question mais je veux juste souligner que

Stackalloc peut également être utilisé pour appeler des API natives.

De nombreuses fonctions natives exigent que l'appelant alloue un tampon pour obtenir le résultat du retour. Par exemple, la fonction CfGetPlaceholderInfo fonction dans cfapi.h a la signature suivante.

HRESULT CfGetPlaceholderInfo(
HANDLE                    FileHandle,
CF_PLACEHOLDER_INFO_CLASS InfoClass,
PVOID                     InfoBuffer,
DWORD                     InfoBufferLength,
PDWORD                    ReturnedLength);

Afin de l'appeler en C# par interopérabilité,

[DllImport("Cfapi.dll")]
public static unsafe extern HResult CfGetPlaceholderInfo(IntPtr fileHandle, uint infoClass, void* infoBuffer, uint infoBufferLength, out uint returnedLength);

Vous pouvez utiliser la fonction stackalloc.

byte* buffer = stackalloc byte[1024];
CfGetPlaceholderInfo(fileHandle, 0, buffer, 1024, out var returnedLength);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X