C attribute: unsequenced, reproducible (since C23)
関数呼び出しの特定の特性を推論できるように、関数によるオブジェクトへのアクセスに関する情報をコンパイラに提供します。
目次 |
構文
[[
unsequenced
]]
[[
__unsequenced__
]]
|
(1) | ||||||||
[[
reproducible
]]
[[
__reproducible__
]]
|
(2) | ||||||||
説明
これらの属性は、関数宣言子または関数型を持つ型指定子に適用されます。対応する属性は関数型のプロパティです。
エフェクトなし
関数呼び出しの評価は、呼び出し中に逐次実行されるストア操作が呼び出しと同期するオブジェクトの変更である場合、効果を持たない。さらに、その操作が観測可能である場合、オブジェクトへのすべてのアクセスは関数のユニークポインタパラメータに基づいていなければならない。
冪等性
評価 E は、2回目の E の評価を元の評価の直後にシーケンスしても、結果の値(存在する場合)や実行の観測可能な状態が変化しない場合、冪等性を持つ。
ステートレス
関数 F は、静的記憶域期間またはスレッド 記憶域期間 を持つオブジェクトの定義が、 F 内または F によって呼び出される関数内で const 修飾されているが volatile 修飾されていない場合、ステートレスである。
独立
関数 F は、呼び出しのパラメータに基づかない左辺値を通じて F の呼び出しによって観測される任意のオブジェクト X について、同じプログラム実行中の F へのすべての呼び出しにおける X へのすべてのアクセスが同じ値を観測する場合、独立している。 そうでない場合、アクセスがポインタパラメータに基づくものであれば、そのようなポインタパラメータ P が一意に存在しなければならず、 X への任意のアクセスは P に基づく左辺値へのアクセスでなければならない。
オブジェクト X は、両者が同期し、関数呼び出しに対して X がローカルでなく、 X の寿命が関数呼び出しより前に開始され、かつ呼び出し中に X へのアクセスがシーケンスされる場合、関数呼び出しによって観測される。呼び出し前に格納された X の最終値(存在する場合)は、呼び出しによって観測される X の値と呼ばれる。
注記
これらの属性はコンパイラ最適化の目的で存在します。
関数が再現可能である場合、複数の連続する呼び出しは単一の呼び出しとして扱うことができます。
関数が非シーケンシングされている場合、複数の後続の呼び出しは単一の呼び出しとして扱うことができ、呼び出しは任意に並列化および並べ替えが可能です。