Rust 这是mem::transmute:<&;str,';静态str>;(k) 安全吗?

Rust 这是mem::transmute:<&;str,';静态str>;(k) 安全吗?,rust,Rust,我看的是一个非常简单的库,只有一个文件,大部分是测试,所以它很短。我正试图理解一个结构: pub-struct-ChallengeFields(HashMap); 结构CowStr(Cow选项{ self.0 .get(&UniCase)CowStr(Cow::借用(不安全{ mem::transmute:: 我认为CowStr是一个Cow,具有静态寿命,否则很难或不可能在地图中存储str 是和否,您可以将&'static str存储在hashmap中而不会出现问题,问题是您不能同时存储&'st

我看的是一个非常简单的库,只有一个文件,大部分是测试,所以它很短。我正试图理解一个结构:

pub-struct-ChallengeFields(HashMap);
结构CowStr(Cow选项{
self.0
.get(&UniCase)CowStr(Cow::借用(不安全{
mem::transmute::
我认为
CowStr
是一个
Cow
,具有
静态
寿命,否则很难或不可能在地图中存储str

是和否,您可以将
&'static str
存储在hashmap中而不会出现问题,问题是您不能同时存储
&'static str
字符串

我说得对吗?如果是的话,为什么不简单地使用字符串,这样我们就可以摆脱生命,从而转化

我认为这是一种优化:使用
String
时,每次你想在地图中插入挑战时都必须创建一个分配,但是如果绝大多数挑战名称是
Digest
Basic
,那么这是浪费时间(和内存,但大部分是时间),但同时您必须支持自定义身份验证方案的
String

现在也许在大计划中,这不是一个真正重要的优化,最好不要这样做,我不能告诉你

我不喜欢不安全,读到关于transmute的文章看起来很不安全

这是一件有争议的事情,但在本例中是“安全的”,因为引用对整个
HashMap::get
调用都是有效的,我们知道该调用不会保持引用的活动状态(它依赖于实现细节,这有点冒险,但改变的可能性基本为零,因为这没有多大意义)


延长生命周期本身并不在UB中(文档《mem::transmute》提供了一个这样做的例子),但需要小心,因为您必须避免它导致UBs(最有可能是一个悬而未决的参考).

我不是每次在HashMap中插入
CowStr
时都会创建一个分配吗?我是在分配
CowStr
,即使它包含一个引用,不是吗?不,CowStr只是一个新类型,它不是“运行时”的任何东西。而非空的
字符串
会触发堆分配。哈希映射如何分配不在堆上的内容?例如
循环{my_HashMap.put(CowStr::Owned(something),0)}
。这些
CowStr
存储在哪里?直接存储在hashmap本身中。虽然
CowStr::Owned
表示一个
字符串,其中包含一个堆分配的缓冲区。@Gatonito如果您将答案中的“创建分配”部分想象为“创建额外分配”,可能会更清楚一些是的,
HashMap::insert
分配,但是如果它使用
String
作为键,则需要为所拥有的字符串进行额外的分配,这是可以避免的,并且(在代码作者看来)是不必要的。