如题。 今天学习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]>?
1
共 5 条评论, 1 页
评论区
写评论我存/写的资料在这:https://zjp-cn.github.io/translations/
补充一点, Box<[T]>对C友好
苦瓜老师,我滴超人! 话说苦瓜老师到底存了多少Rust相关资料啊,上次还看到苦瓜老师分享‘static的机制,不过帖子我找不到了(悲。
--
👇
苦瓜小仔:
Box<[T]>
:Vec<T>
小,省空间(所以你有Vec<TypeContainsBox_T>
,它越长就会比Vec<TypeContainsVec_T>
省的越多)Box<[T]>
的长度,如果你知道这块连续存储的上限,或者一次性读到那么长的数据而不变改变其内容(或者说不增加内容),那么的确不需要变长的Vev<T>
[T; N]
和Vec<T>
与Box<[T]>
相互转化Rust 对不同的场景鼓励使用不同的数据结构。所以如果使用
Box<[T]>
够用的话,就不会考虑Vec<T>
;只能使用Vec<T>
,肯定不会考虑Box<[T]>
。关于连续存储的数据结构选择,推荐读这里。
Box<[T]>
:Vec<T>
小,省空间(所以你有Vec<TypeContainsBoxSilceT>
,它越长就会比Vec<TypeContainsVecT>
省的越多)Box<[T]>
的长度,如果你知道这块连续存储的上限,或者一次性读到那么长的数据而不变改变其内容(或者说不增加内容),那么的确不需要变长的Vev<T>
Vec<T>
、Box<[T]>
之间相互转化Rust 对不同的场景鼓励使用不同的数据结构。所以如果使用
Box<[T]>
够用的话,就不会考虑Vec<T>
;只能使用Vec<T>
,肯定不会考虑Box<[T]>
。关于连续存储的数据结构选择,推荐读这里。
请问这个代码是在哪里学习的