El libro Game Coding Complete, Cuarta edición , capítulo 5 ( Inicialización y apagado del juego ), sección Checking Memory contiene este interesante ejemplo de código:
bool CheckMemory(const DWORDLONG physicalRAMNeeded, const DWORDLONG virtualRAMNeeded)
{
MEMORYSTATUSEX status;
GlobalMemoryStatusEx(&status);
if (status.ullTotalPhys < physicalRAMNeeded)
{
// you don’t have enough physical memory. Tell the player to go get a
// real computer and give this one to his mother.
GCC_ERROR("CheckMemory Failure: Not enough physical memory.");
return false;
}
// Check for enough free memory.
if (status.ullAvailVirtual < virtualRAMNeeded)
{
// you don’t have enough virtual memory available.
// Tell the player to shut down the copy of Visual Studio running in the
// background, or whatever seems to be sucking the memory dry.
GCC_ERROR("CheckMemory Failure: Not enough virtual memory.");
return false;
}
char *buff = GCC_NEW char[virtualRAMNeeded];
if (buff)
{
delete[] buff;
}
else
{
// even though there is enough memory, it isn't available in one
// block, which can be critical for games that manage their own memory
GCC_ERROR("CheckMemory Failure: Not enough contiguous memory.");
return false;
}
}
Esto plantea algunas preguntas.
La primera parte solo le pregunta al sistema operativo (Windows) cuánta RAM física está disponible. La parte curiosa es la segunda, que asigna una gran cantidad de memoria y la libera de inmediato:
char *buff = GCC_NEW char[virtualRAMNeeded];
if (buff)
{
delete[] buff;
}
El autor continúa explicando:
... esta función asigna e inmediatamente libera un gran bloque de memoria. Esto tiene el efecto de hacer que Windows limpie cualquier basura que se haya acumulado en el administrador de memoria y verifique que pueda asignar un bloque contiguo tan grande como lo necesite. Si la llamada tiene éxito, esencialmente ha ejecutado el equivalente de una máquina Zamboni a través de la memoria de su sistema, preparándolo para que su juego llegue al hielo ...
Pero tengo mis reservas sobre eso.
"¿Limpiar la basura acumulada en el administrador de memoria?" De Verdad? Si el juego acaba de comenzar, ¿no debería haber basura?
"¿Asegurándote de que puedes asignar un bloque contiguo?" En el caso muy específico en el que va a administrar la memoria usted mismo, esto tendría algún sentido, pero aún así, si asigna mucha memoria directamente, es casi imposible que se ejecute cualquier otra aplicación. el sistema mientras el tuyo está encendido.
Además, ¿no es probable que esto obligue al sistema operativo a comprometer toda esa memoria y, como consecuencia, expulsar una gran cantidad de memoria en el espacio del disco de intercambio, ralentizando mucho el inicio de la aplicación?
¿Es realmente una buena práctica?
operator new
a nullptr
), si me lo permiten decir. Lo mejor que puedes hacer con ese libro es encender tu chimenea. Asignar y liberar un gran bloque de memoria, por supuesto , no "limpia" la memoria.
new
operador global para que devuelva nulo en lugar de tirar bad_alloc
. Si no lo hicieron, entonces sí, este código es aún más absurdo: P
operator delete
es necesario aceptarlo nullptr
y tratarlo como no operativo. Cualquier sobrecarga global que no haga eso está rota. Lo que significa que no tiene sentido de ninguna manera. Al igual que asumir que asignar un gran bloque de memoria y liberarlo "mágicamente" hará algo bueno. En el mejor de los casos, no hará ningún daño (lo más probable, ya que las páginas ni siquiera se tocan ... de lo contrario, puede cambiar algunas páginas de su conjunto de trabajo que deberá volver a cargar más adelante).