std:: kill_dependency
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definiert im Header
<atomic>
|
||
|
template
<
class
T
>
T kill_dependency ( T y ) noexcept ; |
(seit C++11)
(constexpr seit C++26) (veraltet in C++26) |
|
|
Informiert den Compiler, dass der durch einen
std::memory_order_consume
atomaren Ladevorgang gestartete Abhängigkeitsbaum nicht über den Rückgabewert von
Dies kann verwendet werden, um unnötige
std::memory_order_acquire
Barrieren zu vermeiden, wenn die Abhängigkeitskette den Funktionsbereich verlässt (und die Funktion nicht das
|
(bis C++26) |
|
Gibt einfach y zurück. Diese Funktionsvorlage ist veraltet. |
(seit C++26) |
Inhaltsverzeichnis |
Parameter
| y | - | der Ausdruck, dessen Rückgabewert aus einem Abhängigkeitsbaum entfernt werden soll |
Rückgabewert
Gibt y zurück, nicht länger Teil eines Abhängigkeitsbaums (bis C++26) .
Beispiele
file1.cpp:
struct Foo { int* a; int* b; }; std::atomic<Foo*> foo_head[10]; int foo_array[10][10]; // Die Consume-Operation startet eine Abhängigkeitskette, die diese Funktion verlässt [[carries_dependency]] Foo* f(int i) { return foo_head[i].load(memory_order_consume); } // Die Abhängigkeitskette tritt durch den rechten Parameter in diese Funktion ein und wird // beendet, bevor die Funktion endet (daher findet keine zusätzliche Acquire-Operation statt) int g(int* x, int* y [[carries_dependency]]) { return std::kill_dependency(foo_array[*x][*y]); }
file2.cpp:
[[carries_dependency]] struct Foo* f(int i); int g(int* x, int* y [[carries_dependency]]); int c = 3; void h(int i) { Foo* p; p = f(i); // Die innerhalb von f begonnene Abhängigkeitskette setzt sich in p fort ohne unnötigen Acquire do_something_with(g(&c, p->a)); // p->b wird nicht aus dem Cache geladen do_something_with(g(p->a, &c)); // Linkes Argument besitzt nicht das carries_dependency // Attribut: Memory Acquire Fence könnte ausgegeben werden // p->b wird sichtbar bevor g() betreten wird }
Siehe auch
|
(C++11)
|
definiert Speicherreihenfolge-Einschränkungen für die gegebene atomare Operation
(enum) |
|
C-Dokumentation
für
kill_dependency
|
|