gpt4 book ai didi

c++ - std::mutex::lock() 产生奇怪的(和不必要的)汇编代码

转载 作者:行者123 更新时间:2023-12-01 12:48:29 28 4
gpt4 key购买 nike

我正在检查为我的一些代码生成的 asm,我的眼睛注意到了一些 interesting stuff :

#include <mutex>

std::mutex m;

void foo()
{
m.lock();
}

生成的汇编代码(x86-64 gcc 9.2, -std=c++11 -O2):
foo():
mov eax, OFFSET FLAT:_ZL28__gthrw___pthread_key_createPjPFvPvE
test rax, rax
je .L10 // (1) we can simply bypass lock() call?
sub rsp, 8
mov edi, OFFSET FLAT:m
call __gthrw_pthread_mutex_lock(pthread_mutex_t*)
test eax, eax
jne .L14 // (2) waste of space that will never be executed
add rsp, 8
ret
.L10:
ret
.L14:
mov edi, eax
call std::__throw_system_error(int)
m:
.zero 40

问题:
  • 第 (1) 部分 - gcc 特定:
  • 它在做什么? (分配 TLS 条目?)
  • 该操作失败如何让我们悄悄地绕过 lock()称呼?
  • 第 (2) 部分——看起来每个编译器都受到影响:
  • std::mutex::lock() can throw按标准
  • ...但它永远不会使用正确的代码(如相关的 SO 帖子中所述),出于所有意图和目的 std::mutex::lock()总是 noexcept在正确的代码中
  • 是否可以让编译器知道,以便它停止发出不必要的测试和指令块(如上面的 .L14)?

  • 注:我看不出如何从 std::mutex::lock() throw 比简单的要好 abort() ing。在这两种情况下,你的程序都被搞砸了(没有人希望它会失败),但至少在后一种情况下,你最终得到的汇编代码要小得多(“只为你使用的东西付费”,还记得吗?)。

    最佳答案

    您似乎误解了 asm 输出。你看到的不是foo的代码,而是mutex::lock的内联代码.

    来自 https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/std/mutex :

    void lock() // in class mutex
    {
    int __e = __gthread_recursive_mutex_lock(&_M_mutex);

    // EINVAL, EAGAIN, EBUSY, EINVAL, EDEADLK(may)
    if (__e)
    __throw_system_error(__e);
    }

    来自 https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.0/gthr-default_8h-source.html :
    static inline int __gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex)
    {
    return __gthread_mutex_lock (mutex);
    }

    static inline int __gthread_mutex_lock (__gthread_mutex_t *mutex)
    {
    if (__gthread_active_p ())
    return pthread_mutex_lock (mutex);
    else
    return 0;
    }

    这些名称与您的 asm 代码不完全匹配,因此我可能查看了不同的 libstdc++ 源代码,但对我而言,它看起来像是内联编译器 mutex::lock进入您的函数 foo并且还内联了 mutex::lock 的函数正在调用。

    关于c++ - std::mutex::lock() 产生奇怪的(和不必要的)汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59183456/

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