为什么gcc使用jmp来调用优化版本中的函数

为什么gcc使用jmp来调用优化版本中的函数,第1张

概述当我组装我的程序时,我看到gcc在使用-O3编译时使用jmp进行第二次pthread_wait_barrier调用.为什么会这样?使用jmp而不是call会有什么好处.编译器在这里玩什么技巧?我猜它在这里执行尾调用优化.顺便说一下,我在这里使用静态链接.__attribute__ ((noinline)) void my_pthread_barrier_wa

当我组装我的程序时,我看到gcc在使用-O3编译时使用jmp进行第二次pthread_wait_barrIEr调用.为什么会这样?

使用jmp而不是call会有什么好处.编译器在这里玩什么技巧?我猜它在这里执行尾调用优化.

顺便说一下,我在这里使用静态链接.

__attribute__ ((noinline)) voID my_pthread_barrIEr_wait(     volatile int tID,pthread_barrIEr_t *pbar ) {    pthread_barrIEr_wait( pbar );    if ( tID == 0 )    {        if ( !rollbacked )        {            take_checkpoint_or_rollback( ++iter == 4 );        }    }    //getcontext( &context[tID] );    SETJMP( tID );    asm("addr2jmp:");     pthread_barrIEr_wait( pbar );    // My suspicion was right,gcc was performing tail call optimization,// which was messing up with my SETJMP/LONGJMP implementation,so here I    // put a dummy function to avoID that.    dummy_var = dummy_func();}
最佳答案由于您没有显示示例,我只能猜测:被调用的函数与调用函数具有相同的返回类型,这就像

return func2(...)

或根本没有返回类型(无效).

在这种情况下,“我们”在堆栈上留下“我们的”返回地址,留给“他们”使用它来返回“我们的”调用者.

总结

以上是内存溢出为你收集整理的为什么gcc使用jmp来调用优化版本中的函数全部内容,希望文章能够帮你解决为什么gcc使用jmp来调用优化版本中的函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1047920.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存