有没有一种简单的方法从一个元素中删除元素Vec<T>?
有一个叫做的方法remove(),它需要一个index: usize,但是index_of()我甚至都看不到一种方法.
我正在寻找(希望)简单和O(n)的东西.
LLVM语言将整数类型指定为iN,其中N是整数的位宽,范围从1到2 ^ 23-1(根据:http://llvm.org/docs/LangRef.html#integer-型)
我有两个问题:
将C程序编译为LLVM IR级别时,可以将哪些类型降低到i1,i2,i3等?看起来类型i8,i16,i32,i64必须足够,所以我想知道所有其他近800万个整数类型是什么.
将有符号和无符号整数类型都降低到i32是真的吗?是什么原因,为什么它不适用于32位浮点数(在LLVM中表示为f32)?
考虑一下片段
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,迫使编译器生成一个可能昂贵的按位复制?是否存在根本性的困难,或者我们是否会看到编译器有一天会优化掉这个逐位复制?
我注意到以前从未见过的非常奇怪的事情。此伪代码描述了基本设置:
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) 我正在尝试编写一些玩具代码,用于存储它在一个单词中看到单词的次数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) 我正在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代码进行基准测试,但我无法弄清楚如何设置"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'也没有工作.我应该使用什么旗帜?
我写了一个简单的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) 我想创建一个指定次数打印"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不计算,但作为一个新的表达式输入宏.
我试图找到有关<<和>>运算符如何处理整数的确切信息,但我找不到一个明确的答案(文档在这方面并不是那么好).
语义的两个部分对我来说并不清楚.首先,哪些位"移入"?
0b1110_1010u8 << 4 == 0b1010_0000u8)移入,或0b1110_1010u8 << 4 == 0b1010_1110u8),或此外,移位如何使用有符号整数?符号位是否也参与了班次?或者这是未指定的?
rust ×9
llvm-codegen ×4
llvm ×2
bit-shift ×1
fast-math ×1
macros ×1
optimization ×1
performance ×1
rust-0.8 ×1
rust-macros ×1
types ×1