gpt4 book ai didi

rust - 查找包含vec的类型的分配大小

转载 作者:行者123 更新时间:2023-12-03 11:40:59 26 4
gpt4 key购买 nike

我可以通过调用https://doc.rust-lang.org/std/mem/fn.size_of_val.html来查找一个值有多大。这对于vec来说效果不佳(在我的情况下),因为无论引用多少元素,无论何时取消引用,大小始终为32。
我在下面添加了一些代码,我希望Incoming struct的字节数至少等于变量vec的字节数,因为Incoming struct保留了vec
在调用vec时直接将size_of_val延迟会给我vec正确的大小,但是对于包含vec的类型,我无法执行类似的操作。

use std::mem::size_of_val;

#[derive(Debug)]
enum Incoming {
Bytes(Vec<u8>),
SomethingElse(String),
Fixed(i64)
}

fn main() {
let vec = vec![1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3];

// 39
println!("Vec's real size: {} bytes", size_of_val(&*vec));

let incoming = Incoming::Bytes(vec);
let size_of = size_of_val(&incoming);

// 32
println!("But incoming tells me it's size is {} bytes", size_of);
}
是否有可能为持有 vec的类型获得分配的内存?
用例: Incoming表示我的Rust服务器将处理的所有不同请求。我想调试每个请求的日志。有些请求可能包含带有许多元素的 Vec<u8>。在那种情况下,我不想记录该请求,因为它实际上要花几分钟的时间。

最佳答案

size_ofsize_of_val均指数据结构的“顶层”占用空间。例如,如果您有一个链表,其中每个节点为48个字节,并且链表包含一百万个元素,则size_of将仅返回48,而不是4,800万。
在Rust中,没有自动的方法来计算数据结构的总分配大小,特别是因为包括摊余的分配开销成本或计算共享,循环或自引用数据结构的大小可能很简单。
您可能只想为所需的数据结构族做自己的特征。

trait EstimableSize {
fn estimate_size(&self) -> usize;
}

关于rust - 查找包含vec的类型的分配大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66411866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com