c++ - GCC codegen:pthread_create_key() 与 std::shared_ptr 复制有什么关系?
问题描述
在比较 vs. 的程序集时,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 行汇编程序)比 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
吗?我错过了一些神奇的命令行选项吗?
解决方案
我认为这是因为 GCC 的 libstdc++ 正在检查程序是否实际上是多线程的。如果不是,那么它可以跳过昂贵的锁定指令以原子地修改引用计数器,并恢复为普通的未锁定指令。Boost没有这个特性,无条件使用locked指令。
例如,在 libstdc++ 代码中,您会注意到如果指针为空,我们会使用简单的非原子指令(程序集的第 12 行和第 16-18 行)__gthrw___pthread_key_create
递增和递减引用计数器。[rbp+8]
但如果不是,那么我们将分支到add/xadd
已完成锁定的部分(第 52-58 行)。
我还没有真正深入研究源代码,但我怀疑这些细节隐藏在对_Lock_policy
.
推荐阅读
- mysql - MySQL/MariaDB:创建数据透视表视图
- sql - SQL JSON_VALUE / JSON_QUERY 来自数组并转置为行
- c# - 使用泛型列表时无法编译
在 C# 中 - pandas - 如果数据框中的一个值是 NaN,则检查 pandas 并将其替换为 0
- python-3.x - 如何将授权标头添加到请求中,以便在标头上存在访问令牌时可以访问带有 @jwt_required 的烧瓶路由
- asp.net-core - 忽略数据模型中的属性,同时将它们保留在 EF Core 迁移和数据库表中
- python - FixedRateBond 类对价格债券给出错误
- angular - Angular 9 PWA 哈希不匹配(cacheBustedFetchFromNetwork)
- ios - CABasicAnimation 到达终点的速度比它设置的时间快
- angular - 输入验证在 web 中有效,但在 andriod/ios 中无效