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
Según msdn.microsoft.com/en-us/library/aa366920(VS.85).aspx , ZeroMemory es una macro. Probablemente existe como una conveniencia (por ejemplo, convención de nomenclatura) o por compatibilidad con versiones anteriores.
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 ++.