问题标签 [carries-dependency]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - [[carries_dependency]] 属性是什么意思?
有人能用凡人都能理解的语言来解释吗?
c++ - 在 C++11 中,如何指定隐式“this”参数“[[carries_dependency]]”?
在[dcl.attr.depend]/1中,我读到:
属性[...]
carries_dependency
[...] 可以应用于函数声明或 lambda 中declarator-id
的parameter-declaration
该对象的转换(4.1)。该属性也可以应用于declarator-id
函数声明,在这种情况下,它指定返回值(如果有)携带对函数调用表达式求值的依赖。
我缺少的是一种将属性应用于隐式this
参数的方法。
例如,考虑这个自由函数:
它是等效的(但对于属性)成员版本:
c++ - [[carries_dependency]] 是什么意思以及如何实现
我在这篇SO帖子中阅读了有关 [[carries_dependency]] 的内容。
但我无法理解的是接受的答案中的以下句子:
“特别是,如果将使用 memory_order_consume 读取的值传递给函数,然后没有 [[carries_dependency]],那么编译器可能必须发出内存围栏指令以保证支持适当的内存排序语义。如果参数用 [[carries_dependency]] 注释,则编译器可以假设函数体将正确携带依赖项,并且可能不再需要此栅栏。
类似地,如果一个函数返回一个用 memory_order_consume 加载的值,或者从这样的值派生的值,那么在没有 [[carries_dependency]] 的情况下,编译器可能需要插入一个栅栏指令以保证支持适当的内存排序语义。使用 [[carries_dependency]] 注释,可能不再需要此栅栏,因为调用者现在负责维护依赖关系树。”
让我们一步一步来:
“如果将使用 memory_order_consume 读取的值传递给函数,然后没有 [[carries_dependency]],那么编译器可能必须发出内存栅栏指令以确保支持适当的内存排序语义。”
因此,对于释放-消耗内存模型中的原子变量,当原子变量作为参数传递给函数时,编译器将引入栅栏硬件指令,以便它始终具有提供给函数的原子变量的最新和更新值。
下一个 -
“如果参数用 [[carries_dependency]] 注释,那么编译器可以假设函数体将正确地携带依赖关系,并且这个栅栏可能不再需要。”
这让我很困惑 - 原子变量值已经被消耗了,然后这个函数被携带了什么依赖?
相似地 -
“如果一个函数返回一个加载了 memory_order_consume 的值,或者从这个值派生的值,那么如果没有 [[carries_dependency]],编译器可能需要插入一个栅栏指令以保证支持适当的内存排序语义。使用 [[ carry_dependency]] 注释,这个栅栏可能不再需要,因为调用者现在负责维护依赖树。"
从示例中不清楚它试图说明携带依赖项的意义是什么?
c++ - 为什么逻辑 AND/OR 的左操作数不依赖于父评估?
根据 C++ 标准:
如果 - 将 A 的值用作 B 的操作数,则评估 A 对评估 B 具有依赖性,除非:
— B 是对 std::kill_dependency (29.3) 的任何特化的调用,或
— A 是内置逻辑 AND(&&,参见 5.14)或逻辑 OR(||,参见 5.15)运算符的左操作数,或
— A 是条件 (?:, 见 5.16) 运算符的左操作数,或
— A 是内置逗号 (,) 运算符 (5.18) 的左操作数;(...)
我可以理解为什么在关系之前排序的依赖会在 kill_dependency 调用时停止,但是为什么逻辑 AND、OR、逗号等运算符也会破坏依赖链?
这是否意味着下面的代码具有未定义的行为?