当我反汇编我的程序时,我看到 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(...)
或者根本没有返回类型(void
)。
在这种情况下,“我们”将“我们的”返回地址留在堆栈中,将其留给“他们”使用它返回给“我们的”调用者。
关于c - 为什么 gcc 在优化版本中使用 jmp 调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7984691/