Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么gcc使用jmp来调用优化版本中的函数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

当我组装我的程序时,我看到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来调用优化版本中的函数所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。