Как объявить функцию без ее реализации? - PullRequest
2 голосов
/ 16 марта 2020

Я бы хотел сравнить сборку различных реализаций функций, но я не хочу реализовывать определенные функции, просто объявлять их.

В Rust прямое объявление обычно не требуется из-за компилятора не требуются функции для их разрешения (в отличие от C). Однако возможно ли сделать что-то эквивалентное предварительному объявлению?

Ответы [ 2 ]

4 голосов
/ 17 марта 2020

Если вы объявите свою функцию как #[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
2 голосов
/ 16 марта 2020

Невозможно заранее объявить функции. В Rust есть только одно объявление для любого данного объекта.

Однако вы можете использовать макросы unimplemented!() и todo!(), чтобы быстро заполнить тела функций, которые вы не хотите реализовывать (пока) ) по какой-то причине. Оба в основном являются псевдонимами для panic!() с указанными c сообщениями об ошибках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...