就我对堆栈与堆的了解,很基础,但当涉及到数组时,从我的了解来看,类似下面这样的东西是在堆栈上创建的
float x[100];
而像这样的东西是在堆上创建的
float* x = new float[100];
但是如果我创建一个模板数组类,并将其传递到“堆栈”数组类型中(如float[100]
),会发生什么?例如:
#include <iostream>
using namespace std;
template <class T>
class Array {
public:
int size;
T* data;
Array(int size_) : size(size_) {
data = new T[size];
}
~Array() {
delete [] data;
}
};
int main() {
int m = 1000000;
const int n = 100;
Array<float[n]>* array = new Array<float[n]>(m);
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
array->data[i][j] = i * j;
cout << array->data[10][9] << endl;
delete array;
}
这里到底是什么情况?这个内存是在堆栈上创建的还是在堆上创建的?我猜测应该是在堆上,但是它是如何工作的呢?编译器会分配一个大的内存块,然后将指向每个
n
元素的指针存储进去吗?还是它会分配许多较小的内存块(不一定是连续的),并将指针存储到每个块中?此外,我似乎不能在没有模板的帮助下完成这个操作。具体来说,这段代码无法编译:
int m = 1000;
const int n = 100;
(float[n])* array = new (float[n])[m];
这里发生了什么事情?
编辑:
感谢大家提供的语法提示。我真正感兴趣的是块内发生了什么。
int m = 1000;
const int n = 100;
float (*array)[n] = new float[m][n];
但是我不知道如何在没有使用模板的情况下编写它。我真正感兴趣的一件事是,如果编译器将其分配为堆上的一个大块,如何使用语法array[i][j]
访问特定元素而不存储每个第n个元素的指针?然后我意识到,由于n
是常量,sizeof(float[n])
是固定的,因此当您创建数组时,编译器正在分配一个包含m
个元素的数组,其中每个元素都是一个float[n]
,在我的情况下是100 * 4 = 400
字节。现在一切都有意义了。谢谢!