在哪些情况下 __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真是太坑爹了