我在这篇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]] 注释,这个栅栏可能不再需要,因为调用者现在负责维护依赖树。"
从示例中不清楚它试图说明携带依赖项的意义是什么?