Если вы объявите свою функцию как #[inline(never)]
, вы получите инструкцию вызова функции для предотвращения дальнейшей оптимизации.
Основное ограничение заключается в том, что ваша функция не должна быть пустой после оптимизации, поэтому она должна иметь некоторую сторону эффект (благодаря @hellow, который предлагает использовать compiler_fence
вместо println!
).
Например, этот код ( godbolt ):
pub fn test_loop(num: i32) {
for _i in 0..num {
dummy();
}
}
#[inline(never)]
pub extern fn dummy() {
use std::sync::atomic::*;
compiler_fence(Ordering::Release);
}
Will создайте следующую сборку (с -O
), которая, я думаю, вам нужна:
example::test_loop:
push r14
push rbx
push rax
test edi, edi
jle .LBB0_3
mov ebx, edi
mov r14, qword ptr [rip + example::dummy@GOTPCREL]
.LBB0_2:
call r14
add ebx, -1
jne .LBB0_2
.LBB0_3:
add rsp, 8
pop rbx
pop r14
ret
плюс код для dummy()
, который на самом деле пуст:
example::dummy:
ret