【问题标题】:Why do GCC atomic builtins need an additional "generic" version?为什么 GCC atomic builtins 需要一个额外的“通用”版本?
【发布时间】:2020-02-25 06:01:51
【问题描述】:

根据https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html,有:

type __atomic_load_n (type *ptr, int memorder)

和(“通用”):

void __atomic_load (type *ptr, type *ret, int memorder)

然后

void __atomic_store_n (type *ptr, type val, int memorder)

和(“通用”)

void __atomic_store (type *ptr, type *val, int memorder)

等等

后一个版本的通用性是什么(前一个版本不通用)以及为什么需要它们?

【问题讨论】:

    标签: c gcc intrinsics stdatomic


    【解决方案1】:

    答案就在section 6.55 的 GCC 手册中,上面写着:

    “__atomic”内置函数可以与长度为 1、2、4 或 8 字节的任何整数标量或指针类型一起使用。如果体系结构支持“__int128”(参见 __int128),则也允许使用 16 字节整数类型。

    四个非算术函数(load、store、exchange 和 compare_exchange)也都有一个通用版本。这个通用版本适用于任何数据类型。如果特定的数据类型大小使之成为可能,它会使用无锁内置函数;否则,将在运行时解决外部调用。这个外部调用的格式相同,只是添加了一个“size_t”参数作为第一个参数,指示所指向的对象的大小。所有对象的大小必须相同。

    【讨论】:

    • 在我看来仍然没有必要为此提供两个版本。当然,对于函数,通过引用获取大对象是明智的,但这些是编译器内置函数。编译器应该能够在需要时在内部使用指针,而不必使用两个 API 来打扰用户。
    • @PSkocik shrug 我敢肯定他们选择不这样做是有原因的(编译器团队通常有某种政策来支持他们选择一种机制而不是另一种机制)。如果您真的对此感到好奇,那么我鼓励您联系 gcc 社区(通过他们的 gcc 列表——参见 mailing lists 页面)。自从我与 gcc 社区互动以来已经有一段时间了,但我发现他们过去很愉快而且很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 2010-11-12
    • 2014-09-19
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多