Fragen? Antworten! Siehe auch: Alternativlos
struct node {Die Lektion an der Stelle sollte sein, daß n->next zwar wie ein gemeinsamer Teilausdruck aussieht, den Compiler normalerweise wegoptimieren, aber der Compiler es trotzdem nicht tut, weil hier eben über Zeiger auf Speicher zugegriffen wird. Insbesondere könnte n->next->next->prev so ungünstig liegen, daß bei der ersten Zuweisung n->next überschrieben wird. Das nennt sich Aliasing, und an sich darf der C-Compiler daher hier kein CSE machen. Ich kompiliere das also, und folgender Code kommt raus:
struct node* next, *prev;
};void foo(struct node* n) {
n->next->next->prev=n;
n->next->prev->next=n;
}
movq (%rdi), %rdxWie man sieht, hat gcc hier n->next in rdx gecached. Dieser Code kommt selbst dann raus, wenn man gcc -Wno-strict-aliasing mitgibt. Also vielleicht übersehe ich da ja gerade noch was, aber für mich sieht das wie ein gcc-Bug aus. Seufz.
movq (%rdx), %rax
movq %rdi, 8(%rax)
movq 8(%rdx), %rax
movq %rdi, (%rax)