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

Posted

技术标签:

【中文标题】在哪些情况下 __sync_synchronize 会接收任何参数?【英文标题】:In which cases does __sync_synchronize receive any arguments? 【发布时间】:2022-01-14 23:44:13 【问题描述】:

GCC documentation about __sync builtins 将__sync_synchronize 列为:

__sync_synchronize (...)

这个内置函数发出一个完整的内存屏障。

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

上面的 GCC 文档解释了为什么会出现 ...

英特尔文档中描述了所有例程,以获取“受内存屏障保护的可选变量列表”。目前尚不清楚这是什么意思。这可能意味着只有列出的变量受到保护,或者可能意味着要保护的其他变量的列表。该列表被 GCC 忽略,将其视为空。 GCC 将空列表解释为所有可全局访问的变量都应受到保护。

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

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

所以,如果我想在一个工具中支持内置函数,似乎我可以简单地将其视为声明为__sync_synchronize(void),它总是可以工作的。

是否存在一个可能想要将参数传递给该内置函数的合法案例?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

你可能是对的。他们这样做只是为了确保即使英特尔会更改此函数的原型,代码也会编译。

以上是关于在哪些情况下 __sync_synchronize 会接收任何参数?的主要内容,如果未能解决你的问题,请参考以下文章

对于 GNU ld 'legacy __sync_synchronize' 警告,我能做些啥?

还是说Memory Model,gcc的__sync_synchronize真是太坑爹了

在哪些情况下我们需要在 ARC 下编写 __autoreleasing 所有权限定符?

华图教育_南京_前端实习面试

在啥情况下调用__rmul__?

PHP 构造函数的用途