visual studio microsoft librerias library and windows winapi standard-library std

windows - microsoft - librerias visual studio c++



¿Por qué existen ZeroMemory, etc. cuando ya hay memset, etc.? (8)

Creo que un punto es que las funciones de asignación de memoria deberían tener el mismo aspecto en todos los proyectos de Win32, independientemente del lenguaje de programación. De hecho, como se ha señalado anteriormente, en C, ZeroMemory es realmente memset, la función C. En Delphi,

procedure ZeroMemory(Destination: Pointer; Length: DWORD); begin FillChar(Destination^, Length, 0); end;

donde FillChar es la función Delphi. Y así:

procedure MoveMemory(Destination: Pointer; Source: Pointer; Length: DWORD); begin Move(Source^, Destination^, Length); end; procedure FillMemory(Destination: Pointer; Length: DWORD; Fill: Byte); begin FillChar(Destination^, Length, Fill); end; ...

¿Por qué ZeroMemory y llamadas similares existen en la API de Windows cuando ya hay memset y llamadas relacionadas en la biblioteca estándar de C? ¿A cuáles debo llamar? Adivino que la respuesta es "depende". ¿En que?


En realidad, lo que quiere usar es SecureZeroMemory() .

Un compilador de optimización puede eliminar llamadas a memset() , y SecureZeroMemory() está diseñado para evitar esto.

Solía ​​pensar que las llamadas a ZeroMemory() eran innecesarias hasta que encontré este hecho.


La razón real es que en una plataforma diferente podría implementarse de una manera más eficiente que memset . No olvide que Windows NT fue diseñado como un sistema operativo altamente portátil, en realidad se ejecutaba en Alpha, MIPS y Power PC. Por lo tanto, si la plataforma fooPC salió y tiene algún modo de ensamblaje para configurar la memoria ultrarrápida a cero, puede implementarse sin cambiar la API de alto nivel. Esto ya no es así para Windows, ya que ahora solo admite plataformas x86 y amd64, sin embargo, sigue siendo cierto para Windows CE.


Porque la API de Windows debe ser independiente del idioma. Proporciona suficiente funcionalidad para los desarrolladores, independientemente del idioma que usen. Por supuesto, eventualmente muchas funciones duplicarán la funcionalidad existente ofrecida por los idiomas.

Debe llamar directamente a las funciones de winapi (y macros ) cada vez que necesite un cierto nivel de control: compare fopen() con CreateFile() por ejemplo. De lo contrario, prefiera construcciones específicas del lenguaje a través de llamadas API. Al menos, ganas más independencia de la plataforma.


Porque, ZeroMemory no requiere una línea de comentario



ZeroMemory y otros son parte de la API de Windows. memset es parte de la biblioteca estándar de C.

Para el código de usuario típico, normalmente usaría memset (o el equivalente proporcionado por el idioma de su elección). Si está escribiendo un código de kernel (por ejemplo, un controlador de dispositivo), usar algo como ZeroMemory es más atractivo. Dado que su código se ejecuta en modo kernel de todos modos, no incurre en el costo de un cambio de tarea para usarlo. Dado que ya está en el código de Windows, no tiene un código adicional en su controlador para duplicar lo que ya está allí. Al mismo tiempo, incurre en el costo de una llamada a función y, en el caso o en la reducción a cero (especialmente en un pequeño bloque de memoria), el código en línea puede ser significativamente más rápido, y un rep stosd no rep stosd mucho código (de hecho , configurar y usar rep stosd puede tomar menos código que una llamada de función).


En C y C ++, ZeroMemory() y memset() son exactamente lo mismo.

/* In winnt.h */ #define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length)) /* In winbase.h */ #define ZeroMemory RtlZeroMemory

¿Por qué usar ZeroMemory() entonces? Para hacerlo obvio Pero prefiero memset() en C o C ++.