Programming languages 堆动态还是堆栈动态?

Programming languages 堆动态还是堆栈动态?,programming-languages,heap,callstack,Programming Languages,Heap,Callstack,请向我解释在这段代码中“x”是堆栈动态变量还是堆动态变量?如果是堆动态变量,那么为什么不是堆栈动态变量?谢谢 function foo(){ MyClass x = new MyClass();} 这个具体的例子是:动态堆(我假设您在这里使用JAVA编程)。为什么它不在堆栈上 这将分配内存 它不是一个自动变量 有关一般说明,请参阅本文: 我不确定这是什么语言,我要冒险说这只是伪代码,但是大多数常见的OO语言的概念应该是相同的 让我们来分析一下: function foo() { M

请向我解释在这段代码中“x”是堆栈动态变量还是堆动态变量?如果是堆动态变量,那么为什么不是堆栈动态变量?谢谢

function foo(){ MyClass x = new MyClass();}

这个具体的例子是:动态堆(我假设您在这里使用JAVA编程)。为什么它不在堆栈上

  • 这将分配内存
  • 它不是一个自动变量
有关一般说明,请参阅本文:

我不确定这是什么语言,我要冒险说这只是伪代码,但是大多数常见的OO语言的概念应该是相同的

让我们来分析一下:

function foo() {
    MyClass x = null;
    x = new MyClass();
}
第一行
MyClass x=null
将在本地堆栈上分配一些空间。它没有太多的空间,只够存储一个引用

第二行
x=new MyClass()
将执行以下操作:

  • 在堆上为MyClass的新实例分配空间
  • 调用
    MyClass
  • 更改
    x
    引用以指向此新实例

  • 因此,简单的答案是:两者都有。

    堆栈动态变量在调用函数时就存在了。它们存在于C++运行时堆栈上,是临时的。它们要么在参数列表中,要么在函数中声明(静态除外,静态不在堆栈上实例化)。当这些变量超出范围时,它们就会消失,运行时会回收其内容的内存

    Heap dynamic实例存在于运行时留出的另一个称为“Heap”的内存区域中。这些实例是通过。“new”运算符,并且必须由“delete”运算符显式解除分配


    如果这是家庭作业,我希望这会有所帮助:你认为答案是什么,为什么?不,这不是家庭作业。我想不出更好的例子来说明我的困惑。你为什么要将malloc的内存分配给一个普通的旧字符?还有什么是
    calcSize
    ?好的。这个变量的空间是在运行时分配还是在编译时分配?运行时,编译时只分配原语类型和字符串(带final)。私人最终整数=10;例如,可以是编译时,因此决定将变量声明为堆栈动态还是堆动态的是关键字?例如,“int x=2”是堆栈动态的,因为“int”,而MyClass x=new MyClass()是堆动态的,因为“new”。请注意,像
    MyClass x
    这样的声明不一定只是每种语言中的引用。那么编译器如何决定是否应在堆栈或堆上分配变量?。这里的触发器是“new”关键字吗?还是有更一般的规则?这是因为如果是“int x”而不是“MyClass x”,那将是一个堆栈动态变量。对吗?没错。堆分配几乎总是使用
    new
    malloc
    或类似的方法显式进行的。那么,如果“MyClass”包含像“int y”这样的原语的实例变量会怎么样呢?那么这些也是堆动态的,因为“MyClass”是?这是一个很好的问题,您完全正确。在这种情况下,它将被分配到堆上。