История изменений
Исправление Vic, (текущая версия) :
Более оптимальный для процессора вариант FreeAndNULL() выглядит так.
void FreeAndNULL(void **ObjPtr)
{
void *Obj;
if (ObjPtr == NULL)
return;
Obj = (*ObjPtr);
(*ObjPtr) = NULL;
if (Obj != NULL)
free(Obj);
}
Благодаря промежуточной переменной, меняется порядок логических действий: сначала обработка переменной по адресу *ObjPtr, затем вызов free() - это приводит к тому, что генерируется ассемблерный код, в котором free() не будет вызвана как подпрограмма (с сопутствующим выделением стека и его освобождением), а благодаря совпадению прототипов функций FreeAndNULL() и free(), где с точки зрения процессора это две подпрограммы с одним параметром типа указатель, будет просто переход, т.е. jump _free.
Исправление Vic, :
Более оптимальный для процессора вариант FreeAndNULL() выглядит так.
void FreeAndNULL(void **ObjPtr)
{
void *Obj;
if (ObjPtr == NULL)
return;
Obj = (*ObjPtr);
(*ObjPtr) = NULL;
if (Obj != NULL)
free(Obj);
}
Благодаря промежуточной переменной, меняется порядок логических действий: сначала обработка переменной по адресу *ObjPtr, затем вызов free() - это приводит к тому, что генерируется ассемблерный код, в котором free() не будет вызвана как подпрограмма (с сопутствующим выделением стека и его освобождением), а благодаря совпадению прототипов функций, будет просто переход, т.е. jump _free.
Исходная версия Vic, :
Более оптимальный для процессора вариант FreeAndNULL() выглядит так. Благодаря промежуточной переменной, меняется порядок логических действий, который в коде для процессора (x86) получается на несколько команд короче.
void FreeAndNULL(void **ObjPtr)
{
void *Obj;
if (ObjPtr == NULL)
return;
Obj = (*ObjPtr);
(*ObjPtr) = NULL;
if (Obj != NULL)
free(Obj);
}