C attribute: unsequenced, reproducible (since C23)
Bietet dem Compiler Informationen über den Zugriff auf Objekte durch eine Funktion, sodass bestimmte Eigenschaften von Funktionsaufrufen abgeleitet werden können.
Inhaltsverzeichnis |
Syntax
[[
unsequenced
]]
[[
__unsequenced__
]]
|
(1) | ||||||||
[[
reproducible
]]
[[
__reproducible__
]]
|
(2) | ||||||||
Erklärung
Diese Attribute gelten für einen Funktionsdeklarator oder einen Typspezifizierer, der einen Funktionstyp hat. Das entsprechende Attribut ist eine Eigenschaft des Funktionstyps.
Wirkungslos
Eine Auswertung eines Funktionsaufrufs ist wirkungslos, wenn jeder Speichervorgang, der während des Aufrufs sequenziert ist, die Modifikation eines Objekts ist, das mit dem Aufruf synchronisiert; wenn zusätzlich der Vorgang beobachtbar ist, muss jeder Zugriff auf das Objekt auf einem eindeutigen Zeigerparameter der Funktion basieren.
Idempotent
Eine Auswertung E ist idempotent, wenn eine zweite Auswertung von E unmittelbar nach der ursprünglichen Auswertung sequenziert werden kann, ohne den resultierenden Wert, falls vorhanden, oder den beobachtbaren Zustand der Ausführung zu ändern.
Zustandslos
Eine Funktion F ist zustandslos, wenn jede Definition eines Objekts mit statischer oder Thread- Speicherdauer in F oder in einer Funktion, die von F aufgerufen wird, const qualifiziert, aber nicht volatile qualifiziert ist.
Unabhängig
Eine Funktion F ist unabhängig, wenn für jedes Objekt X , das durch einen Aufruf von F über einen L-Wert beobachtet wird, der nicht auf einem Parameter des Aufrufs basiert, alle Zugriffe auf X in allen Aufrufen von F während derselben Programmausführung denselben Wert beobachten; andernfalls, wenn der Zugriff auf einem Zeigerparameter basiert, muss es einen eindeutigen solchen Zeigerparameter P geben, sodass jeder Zugriff auf X auf einen L-Wert erfolgen muss, der auf P basiert.
Ein Objekt X wird durch einen Funktionsaufruf beobachtet, wenn beide synchronisieren, wenn X nicht lokal für den Aufruf ist, wenn X eine Lebensdauer hat, die vor dem Funktionsaufruf beginnt, und wenn ein Zugriff auf X während des Aufrufs sequenziert ist; der letzte Wert von X , falls vorhanden, der vor dem Aufruf gespeichert wird, wird als der Wert von X bezeichnet, der durch den Aufruf beobachtet wird.
Hinweise
Diese Attribute existieren zum Zweck der Compiler-Optimierung.
Wenn eine Funktion reproduzierbar ist, können mehrere nachfolgende Aufrufe als einzelner Aufruf behandelt werden.
Wenn eine Funktion unsequenced ist, können mehrere nachfolgende Aufrufe als einzelner Aufruf behandelt werden, und die Aufrufe können beliebig parallelisiert und neu geordnet werden.