< 返回版块

PChristinoD 发表于 2022-10-18 06:04

如题。 今天学习talent plan 关于raft的代码时候发现如下数据结构。

pub struct Config {
    pub net: labrpc::Network,
    n: usize,
    // use boxed slice to prohibit grow capacity.
    pub rafts: Arc<Mutex<Box<[Option<raft::Node>]>>>,
    // whether each server is on the net
    pub connected: Box<[bool]>,
    saved: Box<[Arc<SimplePersister>]>,
    // the port file names each sends to
    endnames: Box<[Box<[String]>]>,

    pub storage: Arc<Mutex<Storage>>,

    // time at which make_config() was called
    start: Instant,

    // begin()/end() statistics

    // time at which test_test.go called cfg.begin()
    t0: Instant,
    // rpc_total() at start of test
    rpcs0: usize,
    // number of agreements
    cmds0: usize,
}

这个数据结构内部使用了大量的Box<[T]>,而不是Vec。在我看来,两者都是把在内存上连续分布的数据分配到堆上然后在栈上保存他们的指针,两者功能上并无异同,那Vector拥有更丰富的方法应该使用Vector才对啊?难道是基于容量不可变的考量而选择使用Box<[T]>?

评论区

写评论
苦瓜小仔 2022-10-18 11:17

我存/写的资料在这:https://zjp-cn.github.io/translations/

Easonzero 2022-10-18 10:15

补充一点, Box<[T]>对C友好

作者 PChristinoD 2022-10-18 09:29

苦瓜老师,我滴超人! 话说苦瓜老师到底存了多少Rust相关资料啊,上次还看到苦瓜老师分享‘static的机制,不过帖子我找不到了(悲。

--
👇
苦瓜小仔: Box<[T]>

  1. 在大小为 16 字节,比 Vec<T> 小,省空间(所以你有 Vec<TypeContainsBox_T>,它越长就会比 Vec<TypeContainsVec_T> 省的越多)
  2. 你无法修改 Box<[T]> 的长度,如果你知道这块连续存储的上限,或者一次性读到那么长的数据而不变改变其内容(或者说不增加内容),那么的确不需要变长的 Vev<T>
  3. 你可以在 [T; N]Vec<T>Box<[T]> 相互转化

Rust 对不同的场景鼓励使用不同的数据结构。所以如果使用 Box<[T]> 够用的话,就不会考虑 Vec<T>;只能使用 Vec<T> ,肯定不会考虑 Box<[T]>

关于连续存储的数据结构选择,推荐读这里

苦瓜小仔 2022-10-18 09:27

Box<[T]>

  1. 在大小为 16 字节,比 Vec<T> 小,省空间(所以你有 Vec<TypeContainsBoxSilceT>,它越长就会比 Vec<TypeContainsVecT> 省的越多)
  2. 你无法修改 Box<[T]> 的长度,如果你知道这块连续存储的上限,或者一次性读到那么长的数据而不变改变其内容(或者说不增加内容),那么的确不需要变长的 Vev<T>
  3. 你可以在 [T; N] 、 Vec<T>Box<[T]> 之间相互转化

Rust 对不同的场景鼓励使用不同的数据结构。所以如果使用 Box<[T]> 够用的话,就不会考虑 Vec<T>;只能使用 Vec<T> ,肯定不会考虑 Box<[T]>

关于连续存储的数据结构选择,推荐读这里

leowei1234567 2022-10-18 09:25

请问这个代码是在哪里学习的

1 共 5 条评论, 1 页