LINUX.ORG.RU

История изменений

Исправление 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);
}