首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c#中的堆栈的内存分配,该怎么解决

2012-03-02 
c#中的堆栈的内存分配c#中在堆栈中内存分配是向下填充的,即由高内存地址向低内存地址分配,为了证明这个问

c#中的堆栈的内存分配
c#中在堆栈中内存分配是向下填充的,即由高内存地址向低内存地址分配,为了证明这个问题,写代码如下:
class   Program
        {
                static   unsafe   void   Main(string[]   args)
                {
                        int   x   =   1;
                        int   y   =   2;
                        double   z   =   3.6;
                        Console.WriteLine( "Address   of   x   "   +   (uint)&x);
                        Console.WriteLine( "Address   of   y   "   +   (long)(&y));
                        Console.WriteLine( "Address   of   z   "   +   (long)(&z));

                }
        }
显示结果是:
Address   of   x   1242224
Address   of   y   1242220
Address   of   z   1242212
说明内存由高到低分配。

如果代码如下(即删掉变量z的声明):
class   Program
        {
                static   unsafe   void   Main(string[]   args)
                {
                        int   x   =   1;
                        int   y   =   2;
                        Console.WriteLine( "Address   of   x   "   +   (uint)&x);
                        Console.WriteLine( "Address   of   y   "   +   (long)(&y));
                }
        }
显示结果是:
Address   of   x   1242228
Address   of   y   1242232
内存好像是由低到高分配。

再次重写代码如下(即改变变量y的类型):
class   Program
        {
                static   unsafe   void   Main(string[]   args)
                {
                        int   x   =   1;
                        double   y   =   2.2;
                        double   z   =   3.6;
                        Console.WriteLine( "Address   of   x   "   +   (uint)&x);
                        Console.WriteLine( "Address   of   y   "   +   (long)(&y));
                        Console.WriteLine( "Address   of   z   "   +   (long)(&z));



                }
        }
显示结果是:
Address   of   x   1242212
Address   of   y   1242216
Address   of   z   1242224
内存好像也是由低到高分配。

上述现象怎么解释?



[解决办法]
1、我这测试没有你说的现象,都是从高到低
2、long在.net下为64位,
3、反汇编后代码
int x = 1;
00000000 push ebp
00000001 mov ebp,esp
00000003 sub esp,14h
00000006 push edi
00000007 push esi
00000008 mov dword ptr [ebp-4],1
double y = 2;
0000000f mov dword ptr [ebp-0Ch],0
00000016 mov dword ptr [ebp-8],40000000h
double z = 3.6;
0000001d mov dword ptr [ebp-14h],0CCCCCCCDh
00000024 mov dword ptr [ebp-10h],400CCCCCh
[解决办法]
堆栈是由高到低分配的
我在.net 2.0下测试 没出现你这样的情况。
把这个语句
Console.WriteLine( "Address of y " + (long)(&y));
改成
Console.WriteLine( "Address of y " + (long)&y);
试试`
[解决办法]
hdt(倦怠) ( ) 信誉:120 Blog 2007-01-08 18:34:09 得分: 0


1、我这测试没有你说的现象,都是从高到低
2、long在.net下为64位,
3、反汇编后代码
int x = 1;
00000000 push ebp
00000001 mov ebp,esp
00000003 sub esp,14h
00000006 push edi
00000007 push esi
00000008 mov dword ptr [ebp-4],1
double y = 2;
0000000f mov dword ptr [ebp-0Ch],0
00000016 mov dword ptr [ebp-8],40000000h
double z = 3.6;
0000001d mov dword ptr [ebp-14h],0CCCCCCCDh
00000024 mov dword ptr [ebp-10h],400CCCCCh



---------------------
请问这么纯的反汇编代码是用哪个东西反出来的?? 我在IDA下反的都是IL..讨厌死了
[解决办法]
内存分配是clr控制的,clr会根据系统的情况来决定如何分配。并不一定由低到高。
[解决办法]
内存的分配是随机的,分配的时候先找没有被占用内存然后再具体分配,这和地址高低没有关系吧
------堆的内存分配才是随机的,堆栈就是顺序分配的。

内存分配是clr控制的,clr会根据系统的情况来决定如何分配。并不一定由低到高。
-----只有堆的内存才受托管,而栈的内存是不受clr托管的,栈的表现和在非托管程序里的表现是一样的。

第二、三段代码内存分配是从低到高的,不符合从高到低分配的原则。
------永远都是从高地址向低地址分配,你贴的代码说明不了任何问题,因为你不知道编译器是首先为哪个变量分配内存。有可能先声明的变量后分配内存。但不管怎么样,局部变量的地址肯定是要高于函数实参的地址。


[解决办法]
值类型也要看情况。
如果值类型变量是某个 对象的成员变量,那么这个值的存储空间是在托管堆里面,对象被释放了,该变量的内存也同时被释放。

如果值类型变量是某个函数的局部变量,那么该值的存储空间是在栈里面,根本不需要释放,因为在函数返回的时候就已经释放了。

热点排行