小编hel*_*atv的帖子

如何操作Rust数组的2个可变片?

我有一个需要在单个阵列的两个部分上运行的功能.目的是能够构建一个#[nostd]分配器,该分配器可以将更大数组的变量片返回给调用者,并挂起到数组的其余部分以供将来分配.

这是失败的示例代码:

fn split<'a>(mut item: &'a mut [i32], place: usize) -> (&'a mut [i32], &'a mut [i32]) {
    (&mut item[0..place], &mut item[place..])
}

fn main() {
    let mut mem: [i32; 2048] = [1; 2048];
    let (mut array0, mut array1) = split(&mut mem[..], 768);
    array0[0] = 4;
    println!("{:?} {:?}", array0[0], array1[0]);
}
Run Code Online (Sandbox Code Playgroud)

错误如下:

error[E0499]: cannot borrow `*item` as mutable more than once at a time
 --> src/main.rs:2:32
  |
2 |     (&mut item[0..place], &mut item[place..])
  |           ----                 ^^^^ second mutable …
Run Code Online (Sandbox Code Playgroud)

lifetime slice rust

4
推荐指数
1
解决办法
1009
查看次数

使用宏来初始化大量非复制元素

我正在尝试使用相同的初始化程序初始化大量元素.64个元素只是一个例子 - 我想让它至少达到16k.不幸的是简单

let array : [AllocatedMemory<u8>; 64] = [AllocatedMemory::<u8>{mem:&mut []};64];
Run Code Online (Sandbox Code Playgroud)

因为AllocatedMemory结构没有实现,所以不起作用Copy

error: the trait `core::marker::Copy` is not implemented for the type `AllocatedMemory<'_, u8>` [E0277]
let array : [AllocatedMemory<u8>; 64] = [AllocatedMemory::<u8>{mem:&mut []}; 64];
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

所以我尝试使用宏无济于事:

struct AllocatedMemory<'a, T: 'a> {
    mem: &'a mut [T],
}

macro_rules! init_memory_helper {
    (1, $T : ty) => { AllocatedMemory::<$T>{mem: &mut []} };
    (2, $T : ty) => { init_memory_helper!(1, $T), init_memory_helper!(1, $T) };
    (4, $T : ty) => { init_memory_helper!(2, …
Run Code Online (Sandbox Code Playgroud)

initializer-list static-initializer rust

3
推荐指数
1
解决办法
813
查看次数

在C++ 11中获取std :: vector :: operator [](size)的未定义行为的地址

这是未定义的行为吗?

ptrdiff_t one() {
   std::vector<int> test(1);
   return &test[1] - &test[0];
}
Run Code Online (Sandbox Code Playgroud)

这是未定义的行为吗?

ptrdiff_t zero() {
   std::vector<int> test;
   int * end = &test[0];
   int * begin = &test[0];
   return end - begin;
}
Run Code Online (Sandbox Code Playgroud)

如果其中任何一个是未定义的行为,任何人都可以帮我找到C++ 11规范中的部分,它描述了向量的下标运算符必须在小于(而不是小于或等于)大小的值上调用, 或相反亦然?

谢谢

c++ c++11

2
推荐指数
1
解决办法
402
查看次数

Rust:split_at_mut(即join_mut)是否有相反的说法?

有一个非常不错的split_at_mut函数,它可以占用1个slice并将其分成2个......有一种方法可以撤消该操作,以便我可以再次回到原来的数组-假设我知道它们在内存中是连续的(因为我只是拆分它们)

问题是:是否有类似于join_mut这样的东西:

fn main() {
    let mut item : [u8;32] = [0u8;32];
    let (mut first, mut second) = item[..].split_at_mut(16);
    first[0] = 4;
    second[0] = 8;
    let mut x = first.join_mut(first, second); // <-- compile error
    assert_eq(x[16], 8);
}
Run Code Online (Sandbox Code Playgroud)

split slice rust

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