Kann der C-Compiler-Optimierer das Kurzschließen verletzen und die Speicherzugriffe für Operanden in einem logischen AND-Ausdruck neu anordnen?

Wir kennen diesen logischen AND-Operator &&) garantiert die Auswertung von links nach rechts.

Aber ich frage mich, ob der Compiler-Optimierer jemals die Speicherzugriffsanweisungen für @ neu anordnen kan*a undb->foo im folgenden Code, d. h. der Optimierer schreibt Anweisungen, die versuchen, auf @ zuzugreif*b vor dem Zugriff auf*a.

(Betrachte beidea undb um Zeiger auf Speicherbereiche im Heap zu sein.)

if (*a && b->foo) {
  /* do something */
}

One könnte denken, dass&& verursacht einen Sequenzpunkt, daher muss der Compiler Anweisungen ausgeben, um auf @ zuzugreife*a vor dem Zugriff auf*b aber nach dem Lesen der akzeptierten Antwort beihttps: //stackoverflow.com/a/14983432/117508, Ich bin nicht sicher. Wenn Sie sich diese Antwort ansehen, gibt es Semikolons zwischen den Anweisungen und sie legen auch Sequenzpunkte fest. Daher sollten sie auch das Neuanordnen verhindern. Die Antwort dort scheint jedoch darauf hinzudeuten, dass sie trotz des Vorhandenseins von Semikolons eine Speicherbarriere auf Compilerebene benötigen.

Ich meine, wenn Sie behaupten, dass&& legt einen Sequenzpunkt fest, das gilt dann für Semikolons im Code beihttps: //stackoverflow.com/a/14983432/117508. Warum ist in diesem Code dann eine Speichersperre auf Compilerebene erforderlich?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage