在内存中,有一个称为堆栈的部分,它从顶部开始,向下向堆增长。该堆栈与 LIFO 堆栈相同吗?底部的堆是 FIFO 吗?
当你执行“push”和“pop”时,这会改变内存中的堆栈吗?
我们有一个堆的内存不足错误,但是(只是出于好奇而询问)单个堆栈的大小是否有相同的限制?如果不是,那么如果堆栈帧(如数千个局部变量等)需要多余的内存,那么什么可以防止这种溢出?
这涉及基本的计算机体系结构,即具有堆栈的体系结构,没有特别的。
使用 FILO(先进后出)方法,就像使用 Intel x86 一样,您使用推送和弹出,但是什么表示或决定推送的内容?
例如,我想推送一个“变量”,比如说......我们知道芯片中的所有内容都只是两伏的二进制位、逻辑驱动电路、门、晶体管等。当我推送一个字节时包含以二进制表示的地址,如下所示:1000 0101、133或85(十六进制),一个值被移动到堆栈......这里有一些问题:
1.堆栈到底位于芯片中的什么位置?
2.芯片上的堆栈配置如何启用/禁用数据块的进出?
3.在多任务环境中通常有多个堆栈。额外的堆栈是如何或从哪里来的?
我知道这可能是题外话,但我希望从硬件方面更好地了解堆栈本身。不,我不想看到板的图片,我明白了,但我想设想数据如何到达它,堆栈到底在哪里,它在芯片中是什么,以及它是如何配置的。
这是让我困惑的地方:在 .NET 中,string类型是一个类,但它的行为看起来像是一个值类型!
那么是string值类型(堆栈内存)还是引用类型(堆内存)?
我们知道每个线程都有自己的堆栈。这些堆栈分配在哪里?我读了一些文档,似乎堆栈是在创建线程时从堆中分配的。这有道理吗?提前致谢!
我正在学习操作系统,而我完全不了解的是堆栈和堆栈.我知道它们的好处以及它们的工作原理,但在动态语言的情况下,我无法弄清楚堆栈是如何分配的.
在静态类型语言中,所有原始数据类型都存储在堆栈中,因为它们很小并且将按照它们分配的相同顺序或多或少地解除分配,但是在像PHP这样的语言中,这在运行时才知道.那么堆栈大小和变量分配怎么可能呢?
如果我理解正确,则通过分析原始数据类型的数量和一些偏移量来确定堆栈大小.如何在PHP或其他动态语言中完成该过程?
如果这个问题在黑暗中发生,请给我一些指导如何了解这一点
有没有办法测量一个函数使用了多少堆栈内存?
这个问题不是针对递归函数的;但是我很想知道递归调用的函数会占用多少堆栈内存。
我有兴趣优化堆栈内存使用的函数;然而,在不知道编译器已经进行了哪些优化的情况下,这只是猜测是否正在做出真正的改进。
需要明确的是,这不是关于如何优化以获得更好的堆栈使用的问题。
那么有没有可靠的方法来找出一个函数在 Rust 中使用了多少堆栈内存?
请注意,其他编译器支持这一点,-fstack-usage例如GCC 。
size在 Unix 系统中对可执行文件或目标文件使用该命令时,我们以文本段和数据段大小的形式获得输出。为什么不显示堆或堆栈段的输出?下面是 size 命令的输出
$ size hello_world-1 hello_world-1.o
text data bss dec hex filename
916 256 4 1176 498 hello_world-1
48 0 0 48 30 hello_world-1.o
Run Code Online (Sandbox Code Playgroud) c operating-system memory-management heap-memory stack-memory
我是操作系统的初学者,我有一个关于操作系统内核的问题。
我习惯于每个用户进程都有一个堆栈、堆、数据和代码的虚拟地址空间的标准概念。我的问题是,当操作系统内核发生上下文切换时,内核中运行的代码是否被视为具有堆栈、堆、数据和代码的进程?
我知道有一个专用的内核堆栈,用户程序无法访问它。它是否位于用户程序地址空间中?
我知道操作系统需要维护一些数据结构才能完成它的工作,比如进程控制块。这些数据结构位于何处?它们是否在用户程序地址空间中?它们是否在内核数据结构的某个专用内存段中?它们是否散布在有空间的物理内存周围?
最后,我看到了一些图表,其中操作系统代码位于用户程序地址空间的顶部。整个操作系统内核都在这里吗?如果没有,操作系统内核的代码还驻留在何处?
谢谢你的帮助!
在这个Rust 文档中,写道:
字符串是在堆上分配的。
但是,当我查看内存映射时,我发现它是在堆栈中分配的......
让我们考虑下面的基本 Rust 源文件:
// rustc -o string_vs_str -C opt-level=0 -C debuginfo=2 main.rs
fn main() {
let my_string: String = String::from("abc");
let my_str: &str = "def";
println!("{}{}", my_string, my_str);
let my_string_str: &str = my_string.as_str();
println!("my_string_str: {}", my_string_str);
}
Run Code Online (Sandbox Code Playgroud)
让我们根据以下命令在可执行文件上执行 RUST-GDB:
# rust-gdb --batch --command=test.gdb --args ./string_vs_str
set width 0
set height 0
set verbose off
### Set 2 breakpoints
b main.rs:6
b main.rs:8
### Start the process
r
### Display the memory mapping into the …Run Code Online (Sandbox Code Playgroud) stack-memory ×10
heap-memory ×7
c ×2
memory ×2
rust ×2
string ×2
.net ×1
assembly ×1
callstack ×1
java ×1
jvm ×1
kernel ×1
location ×1
php ×1
terminology ×1