澄清运行

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

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

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

  • 首先,我从来不明白它的含义,“存储分配是静态的”,这意味着它在运行时间之前发生。 现在我的想法是,内存是在程序中分配的,因此在运行程序之前如何分配存储空间? 这是一直困扰着我的一个问题。 在阅读运行时间之前如何分配内存是没有意义的。 我可以编译一个程序,并且永远不会运行它两周,那么它在那之前如何分配内存? 正如你所看到的,我错过了一些东西。
  • 2) 固定堆栈动态 :下标范围是静态绑定的,但分配在声明时完成

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

  • 但是这个工作

     const int size = 100; 
     int data[size];
    
  • 我的猜测是它是“固定的”,因为const在编译期间被看到的事实,所以程序知道这个语句前的大小,这是正确的吗?

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

  • 这是我的教授从未给我们提供过的一个例子,任何人都给我提供了一个例子?
  • 4) 固定堆动态 :类似于固定堆栈动态:存储绑定是动态的,但是在分配之后是固定的(即,当请求时完成绑定并且从堆分配存储而不是堆栈)

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

       int * x = new int [size];
    
  • 由于这个事实,分配的内存在堆上,它是动态分配的内存,而固定部分实际上是大小不能增长,是正确的?

  • 我想为你考虑你的时间,对不起,如果这些问题可能是初级的,但在询问人后,并使用谷歌搜索我得到混合的答案,不知道该相信什么

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

  • 我的教授使用C#中的ArrayList作为示例,因为它可以动态增长,但这只是因为我认为数组列表只是一个与原始数组一起工作的类。 如果数组变大,它只是垃圾收集内存,并分配一个较大的一个,并将其中的元素,这将使它固定堆动态?

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

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

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

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

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

    链接地址: http://www.djcxy.com/p/2233.html

    上一篇: Clarification on run

    下一篇: Which is faster: while(1) or while(2)?