堆栈数据大小

时间:2017-08-21 13:12:27

标签: stack size

我找不到这个问题的答案。堆栈上推送的数据大小是多少?

假设您在堆栈上推送一些数据。例如一个int。然后堆栈指针的值减少4个字节。

直到今天,我认为可以在堆栈上推送的最大数据不能大于指针大小。但我做了一个小实验。我用C#编写了一个简单的应用程序:

int i = 0;    //0x68 <-- address of variable
int j = 1;    //0x64 
ulong k = 2;  //0x5C
int l = 3;    //0x58

由于我的预测,ulong应该在堆上分配,因为它需要8个字节,而我正在使用32位系统(因此指针大小为4个字节)。这将是非常奇怪的,因为这是一个简单的局部变量。

但它被推上了堆栈。

所以我认为我认为堆栈的方式有问题。因为堆栈指针“知道”如果必须更改4个字节(如果我们推入int)或8个字节(如果我们推长或双)或仅1个字节?

或者局部变量的值可能在堆上,但这些变量的地址在堆栈上。但这没有任何意义,因为这就是对象的处理方式。当我创建对象(使用new关键字)时,对象被分配在堆上,并且该对象的地址被推送到堆栈上,对吗?

那么有人可以告诉我(或给文章链接)它是如何运作的吗?

1 个答案:

答案 0 :(得分:1)

编译器或运行时环境知道您正在使用的数据类型,并知道如何构建适合堆栈的单元。因此,例如,在堆栈指针仅以32位块移动的架构上,编译器或运行时将知道如何格式化一个长度超过32位的数据元素作为多个32位块来推送它们。类似地,它将知道如何将它们从堆栈中弹出并重建适当类型的变量。

这里的问题与其他任何类型的内存没有什么不同。 CPU架构将进行优化,以处理特定大小的少量数据元素,但编程语言通常提供更广泛的数据类型。编译器或运行时环境必须处理这种情况所需的数据打包和解包。