在编译时从堆栈和内存分配中读取

时间:2011-11-28 07:32:36

标签: stack memory-management

只能从堆栈顶部放置和删除对象。但阅读和写作他们的价值观呢?如果我错了,请纠正我,但我认为进程必须能够从堆栈的任何部分读取,因为如果只能从顶部读取,则必须删除(并存储某处)上面堆栈的整个内容一个它想要检查的变量。但在这种情况下,该过程如何知道堆栈中的确切位置是特定变量?我怀疑它只是一个指向它的指针,但该指针存储在哪里?

另一件事 - 阅读有关堆栈的信息我经常会发现这样的短语:“在编译时分配堆栈的所有内存都是已知的”。好吧,我可能误解了这个,所以请告诉我逻辑中的缺陷在哪里: 假设当if()语句为真时创建局部变量,而当它为假时则不是。是否真的会在运行时结束。所以在编译时没有办法知道它是否应该被创建,因此我不认为它的内存是完全分配的,因为它会浪费。因此,它不会在编译时创建/知道。

1 个答案:

答案 0 :(得分:0)

在编译时,已知每种类型需要多少空间:例如,Integer在32位平台上为4字节宽,而具有2个整数的类消耗8字节。是否为特定变量分配此空间不一定是已知的(可能取决于if,如您所述。)

调用方法时,所有参数和返回地址都会被压入堆栈。要获得一个参数,您需要将堆栈向上移动到其位置,该位置由基指针和每个参数的大小计算。

因此,对于此堆栈,您只能访问top元素并不完全正确。但是,它是Stack数据结构。