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