gpt4 book ai didi

c++ - GCC 代码生成器:pthread_create_key() 与 std::shared_ptr 复制有什么关系?

转载 作者:行者123 更新时间:2023-12-04 11:10:35 25 4
gpt4 key购买 nike

在比较 std::shared_ptr 的组件时对比 boost::shared_ptr ,我注意到 GCC 为

void test_copy(const std::shared_ptr<int> &sp) { auto copy = sp; }
( https://godbolt.org/z/efTW6MoEh – 超过 70 行汇编程序) 比 GCC 的 shared_ptr 实现所基于的 boost 版本:
void test_copy(const boost::shared_ptr<int> &sp) { auto copy = sp; }
( https://godbolt.org/z/3aoGq1f9P – 大约 30 行汇编代码)。
特别是,我对 std::shared_ptr 中的以下说明感到困惑版本,我无法(很容易)在来源中找到。
movq    __gthrw___pthread_key_create(unsigned int*, void (*)(void*))@GOTPCREL(%rip), %rbx
有人可以解释为什么 std::shared_ptr生成的代码比 boost::shared_ptr 多得多?我错过了一些神奇的命令行选项吗?

最佳答案

我认为这是因为 GCC 的 libstdc++ 正在检查程序是否实际上是多线程的。如果不是,那么它可以跳过昂贵的锁定指令来原子地修改引用计数器,并恢复到普通的解锁指令。 Boost 没有这个特性并且无条件地使用锁定指令。
例如,在 libstdc++ 代码中,您会注意到如果指针 __gthrw___pthread_key_create为空,我们在 [rbp+8] 处递增和递减引用计数器使用简单的非原子指令(汇编的第 12 和 16-18 行)。但如果不是,那么我们分支到锁定的部分 add/xadd完成(第 52-58 行)。
我还没有真正深入研究源代码,但我怀疑这些细节隐藏在对 _Lock_policy 的引用中。 .

关于c++ - GCC 代码生成器:pthread_create_key() 与 std::shared_ptr 复制有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68329639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com