LINUX.ORG.RU

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

Исправление alysnix, (текущая версия) :

Думается мне что то что вы отыграете убрав «лишний» dereference будет съедено первым же free().

а если там не будет free? а если будет один free на миллион элементов? а если там вообще не будет удалений, а будет вставка элемента.

Полное Г написал ваш чат-жпт.

чатгпт сам ничего не пишет. он просто показывает, как пишут другие в таких случаях. то, что было в его тренировочных датасетах, то он и напишет.


в «коде столярова» три лишних операции чтения памяти как минимум: везде где есть адресное выражение - (*pcur), и это при любой ветке if.

даже если ни один ключ не подойдет, вы делаете вместо трех(сравнение текущего на нул, проверка ключа, переписывание текущего) обращений к памяти, шесть в лучшем случае! канонический способ вместо трех лишних обращений делает переписывание из регистра в регистр.

 while (*pcur)
        if ((*pcur)->data == key) {
            struct Node* tmp = *pcur;
            *pcur = (*pcur)->next;
            free(tmp);
        } else
            pcur = &(*pcur)->next;

столярова спасает только то, что оптимизатор все равно его алгоритм переделает на канонический и что есть кеширование памяти.

Исправление alysnix, :

Думается мне что то что вы отыграете убрав «лишний» dereference будет съедено первым же free().

а если там не будет free? а если будет один free на миллион элементов? а если там вообще не будет удалений, а будет вставка элемента.

Полное Г написал ваш чат-жпт.

чатгпт сам ничего не пишет. он просто показывает, как пишут другие в таких случаях. то, что было в его тренировочных датасетах, то он и напишет.


в «коде столярова» три лишних операции чтения памяти как минимум: везде где есть адресное выражение - (*pcur), и это при любой ветке if.

даже если ни один ключ не подойдет, вы делаете вместо трех(сравнение текущего на нул, проверка ключа, переписывание текущего) обращений к памяти, шесть в лучшем случае! канонический способ вместо трех лишних обращений делает переписывание из регистра в регистр.

 while (*pcur)
        if ((*pcur)->data == key) {
            struct Node* tmp = *pcur;
            *pcur = (*pcur)->next;
            free(tmp);
        } else
            pcur = &(*pcur)->next;

столярова спасает только-то, что оптимизатор все равно его алгоритм переделает на канонический и что есть кеширование памяти.

Исходная версия alysnix, :

Думается мне что то что вы отыграете убрав «лишний» dereference будет съедено первым же free().

а если там не будет free? а если будет один free на миллион элементов? а если там вообще не будет удалений, а будет вставка элемента.

Полное Г написал ваш чат-жпт.

чатгпт сам ничего не пишет. он просто показывает, как пишут другие в таких случаях. то, что было в его тренировочных датасетах, то он и напишет.


в данном коде три лишних операции чтения памяти как минимум: везде где есть адресное выражение - (*pcur), и это при любой ветке if.

даже если ни один ключ не подойдет, вы делаете вместо трех(сравнение текущего на нул, проверка ключа, переписывание текущего) обращений к памяти, шесть в лучшем случае! канонический способ вместо трех лишних обращений делает переписывание из регистра в регистр.

 while (*pcur)
        if ((*pcur)->data == key) {
            struct Node* tmp = *pcur;
            *pcur = (*pcur)->next;
            free(tmp);
        } else
            pcur = &(*pcur)->next;

столярова спасает только-то, что оптимизатор все равно его алгоритм переделает на канонический и что есть кеширование памяти.