Skip to content

rust constfn

hiromi-mi edited this page Oct 7, 2020 · 1 revision

rust の const fn の限界を知りたい

  • Q. 意味はあるの?
  • A. 意味はない

以下は 2020.9 現在 nightly でしか動作しない

Sized 以外の trait 制約はあれ

// SPDX-License-Identifier: CC0-1.0

#![feature(const_trait_bound_opt_out)] // https://github.com/rust-lang/rust/issues/67794
#![allow(incomplete_features)]
#![feature(associated_type_bounds)]
#![feature(const_trait_impl)]
#![feature(const_fn)]
#![feature(const_eval_limit)]
// recursion_limit は const fn でも普通の関数でも共通
#![recursion_limit="100000000000000"]
// const_eval_limit : interpreter step limit
//https://github.com/rust-lang/rust/blob/96bb8b31c81dc2394317f2f083c3acf8087efea1/src/doc/unstable-book/src/language-features/const-eval-limit.md
#![const_eval_limit="100000000000000"]
const fn hoge(n: i64) -> i64 {
    if n == 0 {
        return 0;
    }
    if n % 2 == 0 {
        return hoge(n-1)+n
    }
    hoge(n-1)-n
}

fn main() {
// 1000万回再帰してフリーズ
// 100万回再帰して30秒くらい
// 30万回再帰して7.5秒くらい
// 10万回再帰して3.6秒くらい
// 1万回再帰して 0.9秒くらい
    const CNT:i64 = 100_100;
    const X:i64 = hoge(CNT);
    println!("count: {}", CNT);
    println!("completed: {}",X);
}

Clone this wiki locally