rust - 是否有任何实际考虑更喜欢将向量转换为切片的一种表示法?

标签 rust slice notation

可以通过以下任一方式将向量取消引用到切片中:

  • let slice = &*my_vec;
  • let slice = &my_vec[..];

我更喜欢第二种,尽管它更冗长,但我发现它更清晰,尤其是当语句与频繁使用的运算符混合使用时,并且取消引用具有不同的含义,具体取决于 Box/Vec/指针类型。

另一方面,它使用了冗余范围。

我想忽略代码风格的个人偏好并关注有形差异。他们是否曾为发布版本编译成不同的代码?

最佳答案

优化后严格没有区别:

#[no_mangle]
extern {
    fn simple(ptr: *const u8, len: usize) -> usize;
}

fn take_slice(slice: &[u8]) {
    unsafe { simple(slice.as_ptr(), slice.len()); }
}

#[inline(never)]
fn take_vec_auto(v: &Vec<u8>) {
    take_slice(v);
}

#[inline(never)]
fn take_vec_deref(v: &Vec<u8>) {
    take_slice(&*v);
}

#[inline(never)]
fn take_vec_index(v: &Vec<u8>) {
    take_slice(&v[..]);
}

导致以下 LLVM IR on the playground :

; Function Attrs: noinline nounwind uwtable
define internal fastcc void @_ZN8rust_out13take_vec_auto17h2827abd8ce79beacE(i8* %.0.0.0.0.0.val, i64 %.0.1.val) unnamed_addr #0 {
entry-block:
  %0 = tail call i64 @simple(i8* nonnull %.0.0.0.0.0.val, i64 %.0.1.val) #2
  ret void
}

; Function Attrs: noinline nounwind uwtable
define internal fastcc void @_ZN8rust_out14take_vec_deref17h66cf4ce954b36d1dE(i8* %.0.0.0.0.0.val, i64 %.0.1.val) unnamed_addr #0 {
entry-block:
  %0 = tail call i64 @simple(i8* nonnull %.0.0.0.0.0.val, i64 %.0.1.val) #2
  ret void
}

; Function Attrs: noinline nounwind uwtable
define internal fastcc void @_ZN8rust_out14take_vec_index17h77571b14bbdb120cE(i8* %.0.0.0.0.0.val, i64 %.0.1.val) unnamed_addr #0 {
entry-block:
  %0 = tail call i64 @simple(i8* nonnull %.0.0.0.0.0.val, i64 %.0.1.val) #2
  ret void
}

所以这主要是风格问题,而风格是主观的。

关于rust - 是否有任何实际考虑更喜欢将向量转换为切片的一种表示法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42241233/

相关文章:

reflection - 如何使用反射调用带有一些参数的未知 Rust 函数?

asynchronous - tokio async rust 上的 Yield 是什么意思?

python - numpy.array 从 d 维数组中选择所有偶数元素

arrays - 为什么 *S Slice 可以由文字 S 开头?

algorithm - 比较算法的复杂性

for-loop - 将向量传入 `for` 循环与对向量的引用是什么意思?

rust - BigUint 二进制补码

python - 在 NumPy 中使用 2 个维度进行索引时出错

java - 在 Java 中打印堆栈,以便该数字可用

versioning - 在版本号中使用句点的历史原因?