История изменений
Исправление 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;
столярова спасает только-то, что оптимизатор все равно его алгоритм переделает на канонический и что есть кеширование памяти.