在堆栈上分配内容非常棒,因为我们有 RAII,并且不必担心内存泄漏等问题。然而有时我们必须在堆上分配:
两个问题:
为什么我们不能分配动态内存(即大小为
仅在运行时知道)在堆栈上?
为什么堆上的内存只能通过指针来引用,而栈上的内存可以通过普通变量来引用? IE。Thing t;
.
编辑:我知道一些编译器支持可变长度数组 - 这是动态分配的堆栈内存。但这确实是一般规则的一个例外。我有兴趣了解为什么我们通常不能在堆栈上分配动态内存的根本原因 - 其技术原因及其背后的原因。
为什么我们不能在堆栈上分配动态内存(即大小仅在运行时才知道的内存)?
实现这一点比较复杂。由于完成的可执行文件需要包含才能工作的指令类型,每个堆栈帧的大小都会被烧录到编译的程序中。例如,函数局部变量的布局和其他内容实际上是通过其低级汇编代码中描述的寄存器和内存地址硬编码到程序中的:“变量”实际上并不存在于可执行文件中。让这些“变量”的数量和大小在编译运行之间发生变化会使这个过程变得非常复杂,尽管这并非完全不可能(正如您所发现的,使用非标准变长数组).
为什么堆上的内存只能通过指针来引用,而栈上的内存可以通过普通变量来引用
这只是语法的结果。 C++ 的“正常”变量恰好是那些具有自动或静态存储持续时间的变量。语言的设计者could从技术上来说,你可以写一些类似的东西Thing t = new Thing
只需使用一个t
一整天,但他们没有;同样,这会更难实施。那么如何区分不同类型的对象呢?请记住,您编译的可执行文件必须记住自动销毁一种而不是另一种。
我很想详细说明为什么这些事情很困难,为什么不困难,因为我相信这就是您在这里所追求的。不幸的是,我的装配知识太有限了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)