Khi tôi diassembled chương trình của tôi, tôi thấy rằng gcc đã sử dụng jmp cho phần thứ hai pthread_wait_barrier gọi khi biên soạn với O3. Tại sao nó như vậy?Tại sao là gcc sử dụng jmp để gọi một chức năng trong phiên bản tối ưu hóa
Lợi ích nào nhận được bằng cách sử dụng jmp thay vì gọi. Trình biên dịch nào đang chơi ở đây? Tôi đoán tối ưu hóa cuộc gọi đuôi của nó ở đây.
Bằng cách tôi đang sử dụng liên kết tĩnh tại đây.
__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();
}
Hiển thị cho chúng tôi mã nguồn. –
jmp chỉ chuyển giao thực thi đến một vị trí mới. gọi đẩy công cụ lên ngăn xếp và do đó hơi tốn kém hơn để sử dụng. –
Hình như tối ưu hóa cuộc gọi đuôi thực hiện. – MetallicPriest