Vector 如何访问作为基础类型的新类型向量
我有一个新类型:Vector 如何访问作为基础类型的新类型向量,vector,rust,casting,Vector,Rust,Casting,我有一个新类型: #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] pub struct Foo(pub u32); 和它们的一个向量: let v: Vec<Foo> = Vec::new(); 我假设编译器没有足够的聪明来优化它们,即使使用#[repr(transparent)]如果您不能更改Foo的定义,那么您就不能,因为无法保证Foo具有与u32相同的
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
pub struct Foo(pub u32);
和它们的一个向量:
let v: Vec<Foo> = Vec::new();
我假设编译器没有足够的聪明来优化它们,即使使用
#[repr(transparent)]
如果您不能更改Foo
的定义,那么您就不能,因为无法保证Foo
具有与u32
相同的内存表示形式
如果可以更改Foo
的定义,则需要添加以下内容:
现在,您可以使用在Foo
和u32
之间进行转换:
let u32_val: u32 = mem::transmute(Foo(42));
let foo_val: Foo = mem::transmute(u32_val);
不过,我不确定这是如何转化为向量的。它可能会工作,但我不认为它是有保证的(这可能是未定义的行为)。共享对
Vec
的引用没有多大意义,因为您无论如何都不能对它进行变异。您可能需要一个切片,您可以使用slice::from_raw_parts(v.ptr()作为*u32,v.len())获得该切片。这当然是非常不安全的,因为Rust将无法强制执行别名规则,您必须自己执行。@user4815162342您是对的,我很乐意放弃旧的Vec来创建新的。这会降低安全性,只要允许在类型之间进行强制转换。有关详细信息,请参见。在这种情况下,Vec:::from_raw_parts
应等同于转换@Jmb是有效的,但它只允许在不安全的
块或函数中使用,因此我将坚持使用.iter().map()
,除非有安全的方法解决这个问题。@justinas这也需要不安全的
,这并不理想。
u32_vec.iter().map(|x| Foo(*x)).collect()
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
#[repr(transparent)]
pub struct Foo(pub u32);
let u32_val: u32 = mem::transmute(Foo(42));
let foo_val: Foo = mem::transmute(u32_val);