澄清 run-time/compile-time 和 heap/stack
Clarification on run-time/compile-time and heap/stack
(如果我的标题不正确,请原谅,我相信它具有约束力,但如果有任何事情让我知道,我会编辑 title/question)
了解在编程中绑定数据的不同方法(无特定语言)我们了解了 5 种类型。 (我给出了类型,定义在class,下面是我的问题)
1) Static:下标范围是静态绑定的,存储分配是静态的(在 run-time 之前)
- 首先,我一直不明白它在说什么,"storage allocation is static" 意思是它发生在 运行 时间之前。现在我的想法是,内存是在程序期间分配的,那么在 运行 执行程序之前如何分配存储空间?这是最困扰我的一个问题。在阅读 运行 之前如何分配内存时,时间毫无意义。我可以编译一个程序,而且 2 周内从未 运行 它,那么在那之前它是如何分配内存的呢?如您所见,我遗漏了一些东西。
2) 已修复stack-dynamic:下标范围是静态绑定的,但分配是在声明时完成的
我想确保我的示例是正确的,在 C++ 中你不能这样做(在 VS 2015 上测试)
整数大小 = 100;
int 数据[大小];
但这行得通
const int size = 100;
int data[size];
我的猜测是 "fixed",因为在编译时会看到 const,所以程序在执行该语句之前知道大小,这是正确的吗?
3) Stack-dynamic:下标范围是动态绑定的,存储分配是动态的(在run-time完成)
- 这是我的教授从未给过我们的一个例子,有人能给我一个吗?
4) Fixed Heap-dynamic: 类似于 fixed stack-dynamic: 存储绑定是动态的,但在分配后是固定的(即绑定在请求时完成,并且存储是从堆中分配的,而不是堆栈)
如果我是对的,这就是一个例子
int * x = new int [size];
由于分配的内存在堆上,是动态分配的内存,固定的部分大小不能增长,对吗?
我想考虑一下你的时间,如果这些问题可能很初级,我很抱歉,但在问了别人和谷歌搜索之后,我得到了不同的答案,不知道该相信什么
5) Heap-dynamic:下标范围和存储分配的绑定是动态的,可以更改任意次数
- 我的教授以 c# 中的 ArrayList 为例,因为它可以动态增长,但这只是混淆,因为我认为 arraylist 只是一个使用原始数组的 class。如果数组变大,它只是垃圾收集内存并分配一个更大的内存并将元素移入其中,这将使它固定heap-dynamic?
"Before run-time"表示在创建程序实例时分配内存(当您选择启动程序时,操作系统会这样做),但在程序开始执行之前。
是的,你是正确的,const int
的值在编译时是已知的,因此编译器可以在编译时使用它来知道数组的大小。
如果您改用变量,则必须在 运行 时间动态分配数组。
"Stack-dynamic"表示变量是在函数调用时创建的,比如函数的参数。它们是 运行-time 和临时的,存在于堆栈中。它们的大小在编译时未知。
您的 "fixed heap dynamic" 示例可能不正确,因为我假设您是在暗示一个变量而不是常量来说明数组的大小。 "Fixed" 在编译时已知,因此您需要使用 constant/literal。 "Fixed heap dynamic" 是一个固定大小的数组,但是在堆上动态分配。
"Heap-dynamic" 并不意味着尺寸可以改变,而是尺寸只有在 运行 时才知道。数组不能自然地改变大小,因为你不能保证它旁边有任何更多的连续内存可以增长。使数组变大通常意味着您必须创建一个新的、更大的数组,并将旧的内容复制到其中,并删除旧的、更小的数组。
(如果我的标题不正确,请原谅,我相信它具有约束力,但如果有任何事情让我知道,我会编辑 title/question)
了解在编程中绑定数据的不同方法(无特定语言)我们了解了 5 种类型。 (我给出了类型,定义在class,下面是我的问题)
1) Static:下标范围是静态绑定的,存储分配是静态的(在 run-time 之前)
- 首先,我一直不明白它在说什么,"storage allocation is static" 意思是它发生在 运行 时间之前。现在我的想法是,内存是在程序期间分配的,那么在 运行 执行程序之前如何分配存储空间?这是最困扰我的一个问题。在阅读 运行 之前如何分配内存时,时间毫无意义。我可以编译一个程序,而且 2 周内从未 运行 它,那么在那之前它是如何分配内存的呢?如您所见,我遗漏了一些东西。
2) 已修复stack-dynamic:下标范围是静态绑定的,但分配是在声明时完成的
我想确保我的示例是正确的,在 C++ 中你不能这样做(在 VS 2015 上测试) 整数大小 = 100; int 数据[大小];
但这行得通
const int size = 100; int data[size];
我的猜测是 "fixed",因为在编译时会看到 const,所以程序在执行该语句之前知道大小,这是正确的吗?
3) Stack-dynamic:下标范围是动态绑定的,存储分配是动态的(在run-time完成)
- 这是我的教授从未给过我们的一个例子,有人能给我一个吗?
4) Fixed Heap-dynamic: 类似于 fixed stack-dynamic: 存储绑定是动态的,但在分配后是固定的(即绑定在请求时完成,并且存储是从堆中分配的,而不是堆栈)
如果我是对的,这就是一个例子
int * x = new int [size];
由于分配的内存在堆上,是动态分配的内存,固定的部分大小不能增长,对吗?
我想考虑一下你的时间,如果这些问题可能很初级,我很抱歉,但在问了别人和谷歌搜索之后,我得到了不同的答案,不知道该相信什么
5) Heap-dynamic:下标范围和存储分配的绑定是动态的,可以更改任意次数
- 我的教授以 c# 中的 ArrayList 为例,因为它可以动态增长,但这只是混淆,因为我认为 arraylist 只是一个使用原始数组的 class。如果数组变大,它只是垃圾收集内存并分配一个更大的内存并将元素移入其中,这将使它固定heap-dynamic?
"Before run-time"表示在创建程序实例时分配内存(当您选择启动程序时,操作系统会这样做),但在程序开始执行之前。
是的,你是正确的,const int
的值在编译时是已知的,因此编译器可以在编译时使用它来知道数组的大小。
如果您改用变量,则必须在 运行 时间动态分配数组。
"Stack-dynamic"表示变量是在函数调用时创建的,比如函数的参数。它们是 运行-time 和临时的,存在于堆栈中。它们的大小在编译时未知。
您的 "fixed heap dynamic" 示例可能不正确,因为我假设您是在暗示一个变量而不是常量来说明数组的大小。 "Fixed" 在编译时已知,因此您需要使用 constant/literal。 "Fixed heap dynamic" 是一个固定大小的数组,但是在堆上动态分配。
"Heap-dynamic" 并不意味着尺寸可以改变,而是尺寸只有在 运行 时才知道。数组不能自然地改变大小,因为你不能保证它旁边有任何更多的连续内存可以增长。使数组变大通常意味着您必须创建一个新的、更大的数组,并将旧的内容复制到其中,并删除旧的、更小的数组。