首页 > 解决方案 > GCC codegen:pthread_create_key() 与 std::shared_ptr 复制有什么关系?

问题描述

在比较 vs. 的程序集时std::shared_ptrboost::shared_ptr注意到 GCC为

void test_copy(const std::shared_ptr<int> &sp) { auto copy = sp; }

https://godbolt.org/z/efTW6MoEh – 超过 70 行汇编程序)比 boost 版本,GCC 的 shared_ptr 实现基于:

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吗?我错过了一些神奇的命令行选项吗?

标签: c++assemblyx86-64shared-ptrgnu

解决方案


我认为这是因为 GCC 的 libstdc++ 正在检查程序是否实际上是多线程的。如果不是,那么它可以跳过昂贵的锁定指令以原子地修改引用计数器,并恢复为普通的未锁定指令。Boost没有这个特性,无条件使用locked指令。

例如,在 libstdc++ 代码中,您会注意到如果指针为空,我们会使用简单的非原子指令(程序集的第 12 行和第 16-18 行)__gthrw___pthread_key_create递增和递减引用计数器。[rbp+8]但如果不是,那么我们将分支到add/xadd已完成锁定的部分(第 52-58 行)。

我还没有真正深入研究源代码,但我怀疑这些细节隐藏在对_Lock_policy.


推荐阅读