在哪些情况下 __sync_synchronize 会收到任何参数?

In which cases does __sync_synchronize receive any arguments?

GCC documentation about __sync builtins__sync_synchronize 列为:

__sync_synchronize (...)

This built-in function issues a full memory barrier.

这意味着一个可变参数函数(接受任意数量的参数),但没有强制性的第一个参数,这在 C 标准中甚至在语法上是不允许的;在任何情况下,假设它可以 运行 摆脱它,因为它是内置编译器,我想知道: 是否存在 any 情况此函数接收哪个参数?

上面的 GCC 文档解释了 ... 存在的原因:

All of the routines are described in the Intel documentation to take “an optional list of variables protected by the memory barrier”. It’s not clear what is meant by that; it could mean that only the listed variables are protected, or it could mean a list of additional variables to be protected. The list is ignored by GCC which treats it as empty. GCC interprets an empty list as meaning that all globally accessible variables should be protected.

对于完整的内存屏障,在里面什么都不写是有意义的。

我尝试用谷歌搜索(例如 this website contains 30 usage examples),查看包含内置函数的 Stack Overflow 问题,并使用 Github 的代码搜索,但我找不到一个调用__sync_synchronize 的参数传递给它。

因此,如果我想支持工具中的内置函数,似乎我可以简单地将其视为声明为 __sync_synchronize(void),并且它将始终有效。

是否存在可能想要将参数传递给该内置函数的合理情况?

您在某种程度上是自我回答的。我认为您缺少的一点信息是内置函数不是真正的函数,它们的参数可能不会传递到任何地方,甚至不会被评估。编译器会在你使用的时候生成一些代码,但是内置的可能不是一个合适的可调用函数。

这些不是任意参数,实际上应该是变量列表(不是,例如表达式)。这可能在 Intel 编译器中有一些神秘的功能,但 gcc 会很乐意忽略。 gcc 可能保留相同的签名以保持与某些现有代码的兼容性。

内置函数可能会对它们明显的参数做一些奇怪的事情,比如 "Neither argument is evaluated." 或“内置函数不计算未选择的表达式”。