Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于运行时/编译时和堆/堆栈的澄清_Java_C++_Memory_Heap Memory_Stack Memory - Fatal编程技术网

Java 关于运行时/编译时和堆/堆栈的澄清

Java 关于运行时/编译时和堆/堆栈的澄清,java,c++,memory,heap-memory,stack-memory,Java,C++,Memory,Heap Memory,Stack Memory,(如果我的标题不正确,请原谅,我相信这是有约束力的,但如果有任何事情让我知道,我将编辑标题/问题) 在学习编程中绑定数据的不同方法(无特定语言)时,我们使用了5种类型。(我给出了类型,并在课堂上给出了定义,下面将是我的问题) 1) 静态:下标范围是静态绑定的,存储分配是静态的(在运行时之前) 首先,我从来都不明白“存储分配是静态的”这句话是怎么说的,意思是它发生在运行时之前。现在我的想法是,内存是在程序运行期间分配的,那么在运行程序之前,存储是如何分配的呢?这是一个最困扰我的问题。在运行时之前

(如果我的标题不正确,请原谅,我相信这是有约束力的,但如果有任何事情让我知道,我将编辑标题/问题)

在学习编程中绑定数据的不同方法(无特定语言)时,我们使用了5种类型。(我给出了类型,并在课堂上给出了定义,下面将是我的问题)

1) 静态:下标范围是静态绑定的,存储分配是静态的(在运行时之前)

  • 首先,我从来都不明白“存储分配是静态的”这句话是怎么说的,意思是它发生在运行时之前。现在我的想法是,内存是在程序运行期间分配的,那么在运行程序之前,存储是如何分配的呢?这是一个最困扰我的问题。在运行时之前阅读有关内存分配的信息毫无意义。我可以编译一个程序,并且在两周内不会运行它,那么在此之前它是如何分配内存的呢?正如你所看到的,我遗漏了一些东西
2) 固定堆栈动态:下标范围是静态绑定的,但分配是在声明时完成的

    我想确保我的例子是正确的,C++中你不能做(在VS 2015上测试) int size=100; int数据[大小]

  • 但这是有效的

     const int size = 100; 
     int data[size];
    
  • 我猜想它是“固定”的,因为在编译时可以看到const,所以程序在执行该语句之前就知道它的大小,对吗

3) 堆栈动态:下标范围是动态绑定的,存储分配是动态的(在运行时完成)

  • 这是我教授从未给过我们的一个例子,有人给我举过吗
4) 固定堆动态:与固定堆栈动态类似:存储绑定是动态的,但在分配后是固定的(即,绑定是在请求时完成的,存储是从堆而不是堆栈分配的)

  • 如果我是对的,这就是一个例子

       int * x = new int [size];
    
  • 由于分配的内存在堆上,它是动态分配的内存,而固定的部分变成了大小不能增长的事实,对吗

我想好好想想你,抱歉,如果这些问题可能是基本的,但在问了别人之后,通过谷歌搜索,我得到了复杂的答案,不知道该相信什么

5) 堆动态:下标范围和存储分配的绑定是动态的,可以更改任意次数

  • 我的教授以c#中的ArrayList为例,因为它可以动态增长,但这只是因为我认为ArrayList只是一个处理基元数组的类。如果数组变大,它只是垃圾收集内存并分配一个更大的内存,然后将元素移动到内存中,这会使它成为固定堆动态的吗
“运行时之前”是指在创建程序实例时(当您选择启动程序时,操作系统会这样做),但在程序开始执行之前分配内存

是的,编译时已知
const int
的值是正确的,因此编译器可以使用它在编译时知道数组的大小。 如果改用变量,则必须在运行时动态分配数组

“堆栈动态”是指在函数调用时创建变量,例如函数的参数。它们是运行时和临时的,并且存在于堆栈上。它们的大小在编译时是未知的

您的“固定堆动态”示例可能不正确,因为我假设您是在暗示一个变量,而不是常量来表示数组的大小。“Fixed”在编译时是已知的,所以需要使用常量/文本。“Fixed heap dynamic”是一个大小固定的数组,但在堆上动态分配


“Heap dynamic”并不意味着大小可以更改,而是意味着只有在运行时才知道大小。数组不能自然地改变大小,因为您不能保证它旁边有更多的连续内存可以扩展。使数组变大通常意味着您必须创建一个新的、更大的数组,并将旧内容复制到其中,然后删除旧的、更小的数组。

这太宽了。@支柱这是我必须要做的,我不仅要理解这5个概念,但也要了解编译时和运行时的工作方式每次只问一个问题。@stall好吧,它们有点联系在一起,但既然帖子已经完成了,我觉得最好还是保持原样当你看实际包含的问题时,我不觉得它“太宽泛”,由于它们都与不同类型分配的术语有关,尽管我知道这样写的方式可能会使对这个主题的搜索变得困难。