【发布时间】:2018-01-29 14:01:54
【问题描述】:
我找不到这个问题的答案。入栈的数据大小是多少?
假设您将一些数据压入堆栈。例如一个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 个字节(如果我们推送 long 或 double)或仅 1 个字节?
或者局部变量的值可能在堆上,但这些变量的地址在堆栈上。但这没有任何意义,因为这就是对象的处理方式。当我创建对象(使用 new 关键字)时,对象是在堆上分配的,并且该对象的地址被推送到堆栈上,对吧?
那么有人可以告诉我(或提供文章链接)它是如何工作的吗?
【问题讨论】:
-
No.