【问题标题】:Clarification on run-time/compile-time and heap/stack [closed]澄清运行时/编译时和堆/堆栈[关闭]
【发布时间】:2016-04-12 22:41:31
【问题描述】:

(如果我的标题不正确,请原谅,我相信它具有约束力,但如果有任何事情请告诉我,我会编辑标题/问题)

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

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

  • 首先,我一直不明白它所说的“存储分配是静态的”,意思是它发生在运行时间之前。现在我的想法是,内存是在程序期间分配的,那么在运行程序之前如何分配存储空间?这是最困扰我的一个问题。在运行时之前阅读有关如何分配内存的信息是没有意义的。我可以编译一个程序,并且从不运行它 2 周,那么在此之前它是如何分配内存的呢?如您所见,我遗漏了一些东西。

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

  • 我想确定我的例子是正确的,在 c++ 中你做不到(在 VS 2015 上测试) 整数大小 = 100; 整数数据[大小];

  • 但是这行得通

     const int size = 100; 
     int data[size];
    
  • 我的猜测是它是“固定的”,因为在编译期间会看到 const,因此程序在执行该语句之前就知道大小,这是正确的吗?

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

  • 这是我的教授从未给我们的一个例子,有人给我一个吗?

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

  • 如果我是正确的,这是一个例子

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

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

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

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

【问题讨论】:

  • 这太宽泛了。
  • @Pillar 这实际上是我所要做的,我不仅要理解这 5 个概念,还要理解编译时与运行时的工作原理
  • 一次只问一个问题。
  • @pillar 好吧,他们有点联系在一起,但由于帖子已经完成,我觉得最好保持原样
  • 当您查看包含的实际问题时,我不觉得它“太宽泛”,因为它们都与不同类型分配的术语有关,尽管我理解这种方式被写可能会使搜索这个主题变得困难。

标签: java c++ memory heap-memory stack-memory


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-19
    • 2013-05-26
    • 1970-01-01
    • 2011-06-13
    • 2015-02-21
    • 1970-01-01
    • 2010-09-12
    • 2021-05-28
    相关资源
    最近更新 更多