carries_dependency]]属性の意味は何ですか?
質問
誰か凡人にもわかる言葉で説明してください。
どのように解決するのですか?
[[carries_dependency]]
は、関数呼び出しに渡って依存関係を持ち運べるようにするために使用されます。このため、コンパイラはより良いコードを生成できる可能性があります。
std::memory_order_consume
を使用した場合、コンパイラーはより良いコードを生成できるようになります。
特に、もし
memory_order_consume
で読み取った値を関数に渡すと、その関数に
[[carries_dependency]]
がない場合、コンパイラは適切なメモリ順序セマンティクスが維持されることを保証するためにメモリフェンス命令を発行しなければならないかもしれません。パラメータに
[[carries_dependency]]
でアノテートされている場合、コンパイラは関数本体が正しく依存関係を運ぶと仮定することができ、このフェンスはもはや必要ないかもしれません。
同様に、もし関数が
memory_order_consume
でロードされた値、またはそのような値から派生した値を返す場合、そのような値なしに
[[carries_dependency]]
がない場合、コンパイラは適切なメモリ順序セマンティクスが維持されることを保証するためにフェンス命令を挿入することが必要になる場合があります。この場合
[[carries_dependency]]
アノテーションを使用すると、呼び出し元が依存関係ツリーを維持する責任があるため、このフェンスはもはや必要ないかもしれません。
など。
void print(int * val)
{
std::cout<<*val<<std::endl;
}
void print2(int * [[carries_dependency]] val)
{
std::cout<<*val<<std::endl;
}
std::atomic<int*> p;
int* local=p.load(std::memory_order_consume);
if(local)
std::cout<<*local<<std::endl; // 1
if(local)
print(local); // 2
if(local)
print2(local); // 3
(1)の行では、依存関係が明示されているので、コンパイラは
local
が再参照されること、そしてPOWER上のフェンスを避けるために依存関係の連鎖が保存されることを保証しなければならないことがわかります。
(2)の行で、定義されている
print
の定義が不透明であるため (インライン化されていないと仮定して)、 コンパイラがフェンスを発行して
*p
で
print
は正しい値を返します。
(3)の行で、コンパイラは
print2
も不透明であるため、パラメータから参照される値への依存関係は命令ストリームに保存され、POWERでのフェンスは不要であるとコンパイラは考えることができます。明らかに
print2
の定義は実際にこの依存関係を保持する必要があるため、この属性は
print2
.
関連
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] シンクロナイズド」とはどういう意味ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む