【发布时间】:2014-09-08 19:31:30
【问题描述】:
与堆相比,我对堆栈的了解非常初级,但是当涉及到数组时,据我所知,这样的东西是在堆栈上创建的
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],在我的情况下是@ 987654333@ 字节。现在一切都说得通了。谢谢!
【问题讨论】:
-
你违反了三法则。我知道这与重点无关,但是查看或键入析构函数定义会自动敲响警钟并让您考虑复制和分配是一个好习惯。 (如果您不想打扰,请在 C++03 中将它们声明为私有或在 C++11 中删除)。
标签: c++ arrays templates heap-memory stack-memory