变量如何存储在堆栈上?

我读过有两个区域的内存堆栈和其他堆。 像int,double,float等基本数据类型存储在堆栈上,而引用类型存储在堆上。 我们知道堆栈是LIFO ,这意味着最后一个被推入的元素将首先被移除。 现在假设下面的代码

int first = 10;
double second = 20.0;
float third = 3.0F;

所以, first会先推,然后是second ,然后是third 。 因此浮点类型的变量third将位于堆栈顶部,但是如果我使用以下代码(假设使用C#)

Console.WriteLine(second);

当变量third位于堆栈顶部时,如何访问变量second值?


堆栈的行为像LIFO的PUSH和POP insturctions.But并不意味着没有弹出你可以阅读堆栈内存。 在你的情况下,你

        push int first            (* its not a opcode of machine, just trying to explain)
        push  double second
        push float third 

        Now you have 2 options to access the variables that you have pushed.

       1) pop -> This is the one that reads and makes stack look like lifo.
         if you pop it
             stack will be
                    int first
                    double second.
            Bsically it removes(not exactly,just a register is chaged to show the stacks last valid memory position)

      2) But if you want you can jst read it without pop.Thus not removing the last times.
         So you will say Read me  double.And it will access the same way it does in heaps..
                  That will cause machine to execute  a mov instruction .

             Please note its EBP(Base pointer) and ESP(Stack pointer) that points to the location of a stacks variables.And machines read variables   as  mov eax,[ebp+2(distance of "second" from where base pointer is now pointing]].

你误解the stack实际上指的是什么。 有一个数据结构Stack使用pushpop来存储数据,但是基于栈和基于头的内存是一个非常抽象的概念。 您可以尝试查看关于基于堆栈的内存分配的Wiki文章,但您还需要了解有关汇编和帧指针的更多信息。 有关于此主题的全部课程都有教授。


我认为你误解了这个概念。

Eric Lippert在这个话题上有几个帖子,我会推荐阅读。 内存管理是一个高级话题。

  • 堆栈是一个实现细节,第一部分
  • 该堆栈是一个实现细节,第二部分
  • 关于价值类型的真相
  • 另外,从下面复制的Marc Gravell发现了这个伟大的答案。

    “所有VALUE类型将被分配到堆栈”是非常非常错误的; 结构变量可以作为方法变量驻留在堆栈上。 但是,某种类型的字段与该类型相同。 如果某个字段的声明类型是一个类,则这些值作为该对象的一部分存储在堆中。 如果一个字段的声明类型是一个结构体,那么这些结构体就是那个结构体所在的结构体的一部分。

    即使方法变量可以放在堆上,如果它们被捕获(lambda / anon-method),或者(例如)迭代器块的一部分。

    链接地址: http://www.djcxy.com/p/82599.html

    上一篇: how variables are stored on stack?

    下一篇: Memory structure for reference and value types