此问题在此处已有答案:
Where are "str" values allocated? Is it in the heap?(1个答案)
上个月关门了。
考虑这段简单的代码
fn main () {
let mut s: &str = "hello";
s = "hey";
println! ("{}", s);
}
字符串
我已经知道字符串字面量本质上是不可变的。我同意这一点,因为变量“s”在这里指的是值“hello”的第一个字符的地址。所以基本上它是一个指针。现在,如果我将s的值更改为“hey”,这并不是在内存中的某个位置”原地“替换值“hello”,而是本质上创建了一个新的地址位置,将值“hey”存储在其中,并将该地址和指针绑定到s。这很容易理解。
但是我感到困惑的是,既然变量的大小在编译时必须知道,才能把它们放在堆栈上,那么字符串的字面量也是存储在堆栈上的吗?或者是堆?也许它们是存储在堆栈上的硬编码值。但是如果它是这样的东西,只能在运行时确定呢?
fn main () {
let mut user_input = String::new();
let stdin = io::stdin(); // We get user input whose size we can't predict
stdin.read_line(&mut user_input);
let ab = user_input.as_str(); // taking the value on heap and turning it to string literal and creating a new reference pointer 'ab' on the stack
println!("input {}, {} ", user_input, ab);
}
型
在上面的字符串文字值'ab'存储在哪里?堆栈还是堆?
2条答案
按热度按时间kqqjbcuj1#
那么字符串文字也存储在堆栈上还是堆上?
这两种. string文字通常都不存储在生成的可执行文件的“rodata”(只读数据)段中。
但如果它是这样的东西,只能在运行时确定?
根据定义,字符串文字在运行时不确定。
在上面的字符串文字值'ab'存储在哪里?堆栈还是堆?
一个string slice(
&str
)不是一个string literal,它是一个指向一个 non-owned string 的指针。当你写user_input.as_str()
时,你只是得到了第二个指向存储在user_input
中的字符串的指针。参见https://doc.rust-lang.org/book/ch04-03-slices.html
ttvkxqim2#
字符串字面量的类型为
&'static str
。注意'static
部分。它们被放置在二进制文件的只读内存中。它不是堆栈也不是堆。您的操作系统在启动进程时分配此内存。这与您编写的内容相同:字符串
Rust会把它放在二进制文件的只读部分。你可以获得一个
'static
引用,因为只要你的进程存在,这个内存就总是有效的。至于字符串文字的大小,编译器显然知道它的大小,因此它知道为它们保留了多少内存。(指针)。它保存一个指向内存的指针,其中字符串字面量(或任何其他字符串切片)开始和它的长度。你可以认为它是
(*const u8, usize)
。所以字符串切片可以指向 * 任何 * 包含字符串的内存。不管它是堆栈、堆还是二进制文件中的其他数据段。你可以从The Rust Book中阅读a chapter on slices,以更好地理解这些概念。