C#高级编程(第四版)中第7章总关于堆栈的机制说
堆栈是由上向下填充的,即由高位地址向低位地址填充的。
例如
{
int i = 10 ;
double d = 30.0
}
如果当前堆栈指针指向的堆栈保留的内存快末尾的地址为800000,则会将i放在存储单元799996 - 799999中,并且值为10.然后再将d放在 799988 -799995的存储单元上。但是我觉得实际上不是这样的的
例如
class test
{
static void Main()
{
int number = 1;
int number2 = 2;
unsafe
{
System.Console.WriteLine("number address {0}", (long)&number);
System.Console.WriteLine("number2 address {0}", (long)&number2); }
}
}
实际上输出的结果是number2的地址大于number.也就是说实际上是由低位向高位填充的。
到底是C#高级编程(第四版)的说法有错误,还是我的理解有错位,相关的内容我在MSDN中没有找到明确的说明,所有只能向大家请教了!
堆栈是由上向下填充的,即由高位地址向低位地址填充的。
例如
{
int i = 10 ;
double d = 30.0
}
如果当前堆栈指针指向的堆栈保留的内存快末尾的地址为800000,则会将i放在存储单元799996 - 799999中,并且值为10.然后再将d放在 799988 -799995的存储单元上。但是我觉得实际上不是这样的的
例如
class test
{
static void Main()
{
int number = 1;
int number2 = 2;
unsafe
{
System.Console.WriteLine("number address {0}", (long)&number);
System.Console.WriteLine("number2 address {0}", (long)&number2); }
}
}
实际上输出的结果是number2的地址大于number.也就是说实际上是由低位向高位填充的。
到底是C#高级编程(第四版)的说法有错误,还是我的理解有错位,相关的内容我在MSDN中没有找到明确的说明,所有只能向大家请教了!
class ClassConvert
{
unsafe static void Main()
{
int number = 1024;
int number2 = 2;
int number3 = 5;
System.Console.WriteLine("number address {0}", (long)&number);
System.Console.WriteLine("number2 address {0}", (long)&number2);
System.Console.WriteLine("number3 address {0}", (long)&number3);
}
}
在我的机器结果为
number address 1242228
number2 address 1242224
number3 address 1242220是按照由高向低的方式入堆栈的,但是屏蔽了number3的代码结果就倒过来了。
class ClassConvert
{
unsafe static void Main()
{
int number = 1024;
int number2 = 2;
System.Console.WriteLine("number address {0}", (long)&number);
System.Console.WriteLine("number2 address {0}", (long)&number2);
}
}在我的机器结果为
number address 1242228
number2 address 1242232按照由低向高的顺序入堆栈!!!
这是怎么回事呀!
int number1,number2根本不在堆,
内建数据类型的局部变量(local)在栈中
在.NET的内存模型下,只有托管的内存才放在托管堆里,有虚拟机负责分配和释放
可是实际的运行结果,有时候是按高到低位入栈,有时候是由低到高位入栈。
不知道我写的那两段代码有什么本质的区别。
在理论上栈确实是向下增长,
当局部变量多于两个的时候确实是向上增长,
当局部变量为3,4,5多个时,就是正常情况
这个应该是算唯一的一个特例吧,具体原因不详,我想可能是微软为了优化framework
int number2 = 2;int分配内存是随机的,哪有空闲内存就分到哪,在这本书里也讲到了。
试一下
struct
{
int number = 1;
int number2 = 2;
}
2 堆 和 栈 是完全不同的数据结构, 而书里写 “堆栈”的,最好看看英文原本是写Stact 还是 Heap
你的变量,递归临时生成的东西,都在栈里面
大学课程倒是轻松 ,一个"堆栈"全解决了
而在系统结构和操作系统的系统级编程里堆是stack,栈是heap
好好回忆一下老师上课讲的吧
顺便问一下,C#中调用函数时的压栈顺序是什么样?相当于C中的_stdcall还是_cdecl?MSIL里看不出来.......学C#才2个月,很多东西感觉都不太明了-_-!。
class Program
{
unsafe static void Main(string[] args)
{
int a = 1024;
int b = 15;
// int c = 16;
Console.WriteLine("address a:{0}", (int)&a);
Console.WriteLine("address b:{0}", (int)&b);
// Console.WriteLine("address c:{0}", (int)&c);
}
}
值类型本来是放在栈中,不过你既然都拿他去COSOLE了,肯定就装箱放堆里了.
兄弟,装箱操作你没看透啊.
有的人测试两种增长方向?
我用的是.NET2.0,winXP 测试结果是2个变量时向上增长,3个向下增长
抱歉,兄弟,看错了哈。
沉默中,为我的草率道歉!
学习ING