Читают ли компиляторы код и оптимизируют случайное распределение памяти? - PullRequest
0 голосов
/ 06 октября 2018

У меня есть код, в котором я объявляю указатель (с именем " удалено ") в виде структуры с именем DLINKED_LIST_NODE .

DLINKED_LIST_NODE curr = dlinked_list_goto_idx(list, idx, false);
DLINKED_LIST_NODE removed;

if(curr->next != NULL)
    removed = curr->next;
else {
    printf("Error @ dlinked_list_remove: No such index.\n");
    exit(1);
}

dlinked_list_goto_idx просто возвращает начальную точку двойного связанного списка.Таким образом, удаляется заголовок списка.

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

Прежде чем выполнить блок removed = curr->next;, я вижу, что адрес удален фактически идентичен curr->next.

Компилятор делает это, чтобы оптимизировать код, или я не вижу очевидных вещей?

Вот как это выглядит, когда я отлаживаюсь до точки, где объявлено Удалено .https://pasteboard.co/HHe6eQE.png

И это экран отладки, где вы можете увидеть curr->next.https://pasteboard.co/HHe7dF8.png

1 Ответ

0 голосов
/ 06 октября 2018

Если вы компилируете с чем-либо, кроме -O0 или его эквивалентом - то есть «без оптимизации» - компилятор вполне может переписать ваш код следующим образом:

register DLINKED_LIST_NODE curr = dlinked_list_goto_idx(list, idx, false);
register DLINKED_LIST_NODE removed = curr->next;

if(removed == 0) {
    printf("Error @ dlinked_list_remove: No such index.\n");
    exit(1);
}

Другими словами, он можетрешили потянуть removed = curr->next до точки объявления, а затем проверить NULL (0) на регистр var removed, потому что проверка содержимого регистра на ноль - это, как правило, довольно дешевый тест, а на самом деле даже непотребовать проверки, если нулевой флаг установлен присваиванием, что может быть в зависимости от архитектуры.

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

Удачи.

...