小编Luk*_*odt的帖子

从向量中删除元素

有没有一种简单的方法从一个元素中删除元素Vec<T>

有一个叫做的方法remove(),它需要一个index: usize,但是index_of()我甚至都看不到一种方法.

我正在寻找(希望)简单和O(n)的东西.

rust

18
推荐指数
6
解决办法
2万
查看次数

LLVM的整数类型

LLVM语言将整数类型指定为iN,其中N是整数的位宽,范围从1到2 ^ 23-1(根据:http://llvm.org/docs/LangRef.html#integer-型)

我有两个问题:

  1. 将C程序编译为LLVM IR级别时,可以将哪些类型降低到i1,i2,i3等?看起来类型i8,i16,i32,i64必须足够,所以我想知道所有其他近800万个整数类型是什么.

  2. 将有符号和无符号整数类型都降低到i32是真的吗?是什么原因,为什么它不适用于32位浮点数(在LLVM中表示为f32)?

types llvm llvm-codegen

17
推荐指数
1
解决办法
7275
查看次数

Rust可以在某天移动对象期间优化掉逐位复制吗?

考虑一下片段

struct Foo {
    dummy: [u8; 65536],
}

fn bar(foo: Foo) {
    println!("{:p}", &foo)
}

fn main() {
    let o = Foo { dummy: [42u8; 65536] };
    println!("{:p}", &o);
    bar(o);
}
Run Code Online (Sandbox Code Playgroud)

该计划的典型结果

0x7fffc1239890
0x7fffc1229890
Run Code Online (Sandbox Code Playgroud)

地址不同的地方.

显然,大型数组dummy已被复制,正如编译器的移动实现中所期望的那样.不幸的是,这可能会产生非平凡的性能影响,因为这dummy是一个非常大的阵列.这种影响可以迫使人们选择通过引用来传递参数,即使函数实际上在概念上"消耗"了参数.

由于Foo没有派生Copy,对象o被移动.由于Rust禁止访问被移动的对象,是什么阻止bar了"重用"原始对象o,迫使编译器生成一个可能昂贵的按位复制?是否存在根本性的困难,或者我们是否会看到编译器有一天会优化掉这个逐位复制?

move-semantics rust llvm-codegen

17
推荐指数
1
解决办法
2612
查看次数

为什么休眠会增加在之前/之后执行的独立代码的执行时间?

我注意到以前从未见过的非常奇怪的事情。此伪代码描述了基本设置:

TARGET_LOOP_TIME = X

loop forever:
    before = now()
    payload()
    payload_time = now() - before
    sleep(TARGET_LOOP_TIME - payload_time)
Run Code Online (Sandbox Code Playgroud)

这种设置相当普遍,例如用于使环路保持60 FPS。有趣的部分是:payload_time依赖于睡眠时间!如果该TARGET_LOOP_TIME值很高,则程序将因此大量睡眠,payload_time则与该程序根本不睡眠时相比,该值要高得多。

为了衡量这一点,我编写了以下程序:

use std::time::{Duration, Instant};

const ITERS: usize = 100;

fn main() {
    // A dummy variable to prevent the compiler from removing the dummy prime
    // code.
    let mut x = 0;

    // Iterate over different target loop times
    for loop_time in (1..30).map(|n| Duration::from_millis(n)) {
        let mut payload_duration = Duration::from_millis(0);

        for _ …
Run Code Online (Sandbox Code Playgroud)

performance rust

17
推荐指数
1
解决办法
193
查看次数

想要使用模式匹配添加到HashMap,一次多次获取可变的可变性

我正在尝试编写一些玩具代码,用于存储它在一个单词中看到单词的次数HashMap.如果密钥存在,则将计数器递增1,如果密钥不存在,则将其与值相加1.我本能地希望用模式匹配来做这个,但是我不止一次地尝试了一个可变的错误:

fn read_file(name: &str) -> io::Result<HashMap<String, i32>> {
    let b = BufReader::new(File::open(name)?);
    let mut c = HashMap::new();

    for line in b.lines() {
        let line = line?;
        for word in line.split(" ") {
            match c.get_mut(word) {
                Some(i) => {
                    *i += 1;
                },
                None => {
                    c.insert(word.to_string(), 1);
                }
            }
        }
    }

    Ok(c)
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

error[E0499]: cannot borrow `c` as mutable more than once at a time
  --> <anon>:21:21
   |
16 |             match c.get_mut(word) {
   |                   - …
Run Code Online (Sandbox Code Playgroud)

rust borrow-checker

16
推荐指数
2
解决办法
2109
查看次数

如何在Rust中读写文本文件?

我正在Win8上使用Rust 0.8编写测试程序,我需要使用数组/矢量/列表读取和写入程序使用的一些参数来访问/从文本文件中访问各行.

在花了相当多的时间试图找到有用的东西之后,我能找到的最接近的东西如下:

use std::rt::io::{file, Open};
use std::path::Path;
use std::rt::io::file::FileInfo;

fn main () {

    let mut reader : file::FileReader = Path("xxxx.txt").open_reader(Open)  
    .expect("'xxxx.txt' could not be opened");

    println("Completed");   
}
Run Code Online (Sandbox Code Playgroud)

如果文件存在,上述"有效".

有人可以告诉我一个如何做我所说的要求的例子吗?

rust rust-0.8

15
推荐指数
1
解决办法
1万
查看次数

如何用"ffast-math"编译?

我正在尝试对一些Rust代码进行基准测试,但我无法弄清楚如何设置"ffast-math"选项.

% rustc -C opt-level=3 -C llvm-args='-enable-unsafe-fp-math' unrolled.rs
rustc: Unknown command line argument '-enable-unsafe-fp-math'.  Try: 'rustc -help'
rustc: Did you mean '-enable-load-pre'?
Run Code Online (Sandbox Code Playgroud)

llvm-args='-ffast-math'并且llvm-args='-fast'也没有工作.我应该使用什么旗帜?

llvm rust fast-math llvm-codegen

15
推荐指数
2
解决办法
1058
查看次数

为什么这段代码比同等的C++/Clang生成更多的程序集?

我写了一个简单的C++函数来检查编译器优化:

bool f1(bool a, bool b) {
    return !a || (a && b);
}
Run Code Online (Sandbox Code Playgroud)

之后我检查了Rust中的等价物:

fn f1(a: bool, b: bool) -> bool {
    !a || (a && b)
}
Run Code Online (Sandbox Code Playgroud)

我用godbolt检查汇编器输出.

C++代码的结果(由clang -O3标志编译)如下:

f1(bool, bool):                                # @f1(bool, bool)
    xor     dil, 1
    or      dil, sil
    mov     eax, edi
    ret
Run Code Online (Sandbox Code Playgroud)

Rust等效的结果要长得多:

example::f1:
  push rbp
  mov rbp, rsp
  mov al, sil
  mov cl, dil
  mov dl, cl
  xor dl, -1
  test dl, 1
  mov byte ptr [rbp - 3], al
  mov byte …
Run Code Online (Sandbox Code Playgroud)

optimization rust llvm-codegen

15
推荐指数
2
解决办法
2145
查看次数

有没有办法用宏来计算?

我想创建一个指定次数打印"Hello"的宏.它的使用方式如下:

many_greetings!(3);  // expands to three `println!("Hello");` statements
Run Code Online (Sandbox Code Playgroud)

创建该宏的天真方式是:

macro_rules! many_greetings {
    ($times:expr) => {{
        println!("Hello");
        many_greetings!($times - 1);
    }};
    (0) => ();
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为编译器不计算表达式; $times - 1不计算,但作为一个新的表达式输入宏.

macros rust rust-macros

14
推荐指数
3
解决办法
2112
查看次数

Rust的移位运算符的确切语义是什么?

我试图找到有关<<>>运算符如何处理整数的确切信息,但我找不到一个明确的答案(文档在这方面并不是那么好).

语义的两个部分对我来说并不清楚.首先,哪些位"移入"?

  • 零从一侧(即0b1110_1010u8 << 4 == 0b1010_0000u8)移入,或
  • 比特旋转(即0b1110_1010u8 << 4 == 0b1010_1110u8),或
  • 它是未指定的(如整数的溢出行为未指定),或
  • 别的.

此外,移位如何使用有符号整数?符号位是否也参与了班次?或者这是未指定的?

bit-shift rust

14
推荐指数
2
解决办法
3221
查看次数