String::from("AT"), -6ren">
gpt4 book ai didi

rust - String::from ("") 将在匹配臂中分配到哪里?

转载 作者:行者123 更新时间:2023-11-29 08:23:15 24 4
gpt4 key购买 nike

我对 Rust 还是很陌生,来自 C 嵌入式世界。

如果我有一段这样的代码:

    match self {
Command::AT => String::from("AT"),
Command::GetManufacturerId => String::from("AT+CGMI"),
Command::GetModelId => String::from("AT+CGMM"),
Command::GetFWVersion => String::from("AT+CGMR"),
Command::GetSerialNum => String::from("AT+CGSN"),
Command::GetId => String::from("ATI9"),
Command::SetGreetingText { ref enable, ref text } => {
if *enable {
if text.len() > 49 {
// TODO: Error!
}
write!(buffer, "AT+CSGT={},{}", *enable as u8, text).unwrap();
} else {
write!(buffer, "AT+CSGT={}", *enable as u8).unwrap();
}
buffer
},
Command::GetGreetingText => String::from("AT+CSGT?"),
Command::Store => String::from("AT&W0"),
Command::ResetDefault => String::from("ATZ0"),
Command::ResetFactory => String::from("AT+UFACTORY"),
Command::SetDTR { ref value } => {
write!(buffer, "AT&D{}", *value as u8).unwrap();
buffer
},
Command::SetDSR { ref value } => {
write!(buffer, "AT&S{}", *value as u8).unwrap();
buffer
},
Command::SetEcho { ref enable } => {
write!(buffer, "ATE{}", *enable as u8).unwrap();
buffer
},
Command::GetEcho => String::from("ATE?"),
Command::SetEscape { ref esc_char } => {
write!(buffer, "ATS2={}", esc_char).unwrap();
buffer
},
Command::GetEscape => String::from("ATS2?"),
Command::SetTermination { ref line_term } => {
write!(buffer, "ATS3={}", line_term).unwrap();
buffer
}
}

它在 Rust 中如何工作?所有这些匹配臂会立即评估,还是只有一个匹配的臂会在堆栈上创建一个可变副本?而且,我的 String::from("") 中的所有字符串文字都会分配到 .rodata 中吗?

有没有更好的方法来完成我在这里尝试做的事情?本质上我想返回一个字符串文字,替换参数(write!宏位)?

最好的问候

最佳答案

只会评估匹配的 ARM 。除了程序的大小之外,不匹配的臂没有成本。

在一般情况下,甚至不可能评估其他 ARM ,因为它们依赖于使用模式解构读取的数据。

关于你的第二个问题,程序中存储文字的位置通常不命名为 rodata,既没有指定也没有保证(通常是去重,但这只是优化)。

关于rust - String::from ("") 将在匹配臂中分配到哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56625809/

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