澄清运行时/编译时和堆/堆栈

时间:2016-04-12 22:41:31

标签: java c++ memory stack heap

(请原谅我,如果我的标题不正确,我相信这是有约束力的,但如果有什么让我知道,我会编辑标题/问题)

了解在编程中绑定数据的不同方法(没有特定语言),我们了解了5种类型。 (我给出了类型,在课堂上给出的定义,在它下面将是我的问题)

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

  • 首先,我从不理解它的含义,"存储分配是静态的"意思是它发生在运行时间之前。现在我的想法是,在程序期间分配内存,那么在运行程序之前如何分配存储?这是一个一直困扰着我的问题。在阅读有关如何在运行时分配内存之前没有任何意义。我可以编译一个程序,并且从不运行它2周,那么在此之前如何分配内存呢?如你所见,我遗失了一些东西。

2)固定堆栈动态:下标范围是静态绑定的,但分配是在声明时完成的

  • 我想确定我的例子是正确的,用c ++你不能做(在VS 2015上测试)  int size = 100;  int data [size];

  • 但这可行

     const int size = 100; 
     int data[size];
    
  • 我的猜测是"修复"由于在编译期间看到const这样的事实,所以程序在命中该语句之前知道大小,这是正确的吗?

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

  • 这是我的教授从未给我们的一个例子,任何人都给我提供了一个?

4)固定堆动态:类似于固定堆栈动态:存储绑定是动态的,但在分配后固定(即,在请求时完成绑定并从堆中分配存储,而不是堆栈)

  • 如果我是对的,这就是这个

    的一个例子
       int * x = new int [size];
    
  • 由于分配的内存在堆上,它是动态分配的内存,而固定部分实际上是大小无法增长,对吗?

我想你想你的时间,对不起,如果这些问题可能是基本的,但在询问了人们之后,谷歌搜索我得到的答案很复杂,不知道该相信什么

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

  • 我的教授在c#中使用了一个ArrayList,因为它可以动态增长,但这只是因为我认为arraylist只是一个使用原始数组的类。如果数组变大,它只是垃圾收集内存并分配一个更大的内存并将元素移入其中,这将使其固定堆动态?

1 个答案:

答案 0 :(得分:1)

“在运行时之前”表示在创建程序实例时(当您选择启动程序时,操作系统执行此操作),但在程序执行开始之前分配内存。

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

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

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

“堆动态”并不意味着大小可以改变,但大小只在运行时才知道。数组不能自然地改变大小,因为你不能保证它旁边有任何可以增长的连续内存。通常使数组更大意味着您必须创建一个新的更大的数组,并将旧内容复制到其中,并删除旧的更小的数组。