Java 关于运行时/编译时和堆/堆栈的澄清
(如果我的标题不正确,请原谅,我相信这是有约束力的,但如果有任何事情让我知道,我将编辑标题/问题) 在学习编程中绑定数据的不同方法(无特定语言)时,我们使用了5种类型。(我给出了类型,并在课堂上给出了定义,下面将是我的问题) 1) 静态:下标范围是静态绑定的,存储分配是静态的(在运行时之前)Java 关于运行时/编译时和堆/堆栈的澄清,java,c++,memory,heap-memory,stack-memory,Java,C++,Memory,Heap Memory,Stack Memory,(如果我的标题不正确,请原谅,我相信这是有约束力的,但如果有任何事情让我知道,我将编辑标题/问题) 在学习编程中绑定数据的不同方法(无特定语言)时,我们使用了5种类型。(我给出了类型,并在课堂上给出了定义,下面将是我的问题) 1) 静态:下标范围是静态绑定的,存储分配是静态的(在运行时之前) 首先,我从来都不明白“存储分配是静态的”这句话是怎么说的,意思是它发生在运行时之前。现在我的想法是,内存是在程序运行期间分配的,那么在运行程序之前,存储是如何分配的呢?这是一个最困扰我的问题。在运行时之前
- 首先,我从来都不明白“存储分配是静态的”这句话是怎么说的,意思是它发生在运行时之前。现在我的想法是,内存是在程序运行期间分配的,那么在运行程序之前,存储是如何分配的呢?这是一个最困扰我的问题。在运行时之前阅读有关内存分配的信息毫无意义。我可以编译一个程序,并且在两周内不会运行它,那么在此之前它是如何分配内存的呢?正如你所看到的,我遗漏了一些东西
-
我想确保我的例子是正确的,C++中你不能做(在VS 2015上测试)
int size=100;
int数据[大小]
- 但这是有效的
const int size = 100; int data[size];
- 我猜想它是“固定”的,因为在编译时可以看到const,所以程序在执行该语句之前就知道它的大小,对吗
- 这是我教授从未给过我们的一个例子,有人给我举过吗
- 如果我是对的,这就是一个例子
int * x = new int [size];
- 由于分配的内存在堆上,它是动态分配的内存,而固定的部分变成了大小不能增长的事实,对吗
- 我的教授以c#中的ArrayList为例,因为它可以动态增长,但这只是因为我认为ArrayList只是一个处理基元数组的类。如果数组变大,它只是垃圾收集内存并分配一个更大的内存,然后将元素移动到内存中,这会使它成为固定堆动态的吗李>
const int
的值是正确的,因此编译器可以使用它在编译时知道数组的大小。
如果改用变量,则必须在运行时动态分配数组
“堆栈动态”是指在函数调用时创建变量,例如函数的参数。它们是运行时和临时的,并且存在于堆栈上。它们的大小在编译时是未知的
您的“固定堆动态”示例可能不正确,因为我假设您是在暗示一个变量,而不是常量来表示数组的大小。“Fixed”在编译时是已知的,所以需要使用常量/文本。“Fixed heap dynamic”是一个大小固定的数组,但在堆上动态分配
“Heap dynamic”并不意味着大小可以更改,而是意味着只有在运行时才知道大小。数组不能自然地改变大小,因为您不能保证它旁边有更多的连续内存可以扩展。使数组变大通常意味着您必须创建一个新的、更大的数组,并将旧内容复制到其中,然后删除旧的、更小的数组。这太宽了。@支柱这是我必须要做的,我不仅要理解这5个概念,但也要了解编译时和运行时的工作方式每次只问一个问题。@stall好吧,它们有点联系在一起,但既然帖子已经完成了,我觉得最好还是保持原样当你看实际包含的问题时,我不觉得它“太宽泛”,由于它们都与不同类型分配的术语有关,尽管我知道这样写的方式可能会使对这个主题的搜索变得困难。