比如c下面我可以这样写
void my_function()
{
    char stack[64];  //  一个char类型数组变量stack,共64个字节
    //...直接使用这个stack
}而c#下面数组都是引用类型
一般用法是
char[] stack = new char[64];
我没看过IL代码,所以我假想空间都开在了堆上有没有直接开在当前函数栈上的实现办法?或者我哪里想错了请纠正

解决方案 »

  1.   

    非要用,可以在不安全的上下文中使用stackalloc。http://msdn.microsoft.com/zh-cn/library/cx9s2sy4(v=vs.90).aspx
      

  2.   

    谢谢!因为my_function要放到循环中去执行,主要还是担心new和自动回收的性能,却又懒得弄个c的dll。
      

  3.   

    你说的栈上开空间并不是明智的做法,因为栈的大小往往很小,被你自己用的数据占用了,那么系统自己可用的就少了,随时可能会栈溢出。存放托管堆的做法没什么问题,用的时候取到栈上,不用的时候放会托管堆,毕竟现在不是DOS时代,程序都很大,数据也很大,而要自己管理数据的存取显然效率没有使用托管堆来得高。
    C/C++的那套做法你还用的话,就是在编程的里程上倒退。
      

  4.   

    怕回收就生命为静态,静态对象用不回收,除非你自己主动去更改对象引用为null
      

  5.   

    错别字更正:
    怕回收就声明为静态,静态对象永不回收,除非你自己主动去更改对象引用为null
      

  6.   

    其实我正在考虑用Parallel.For,所以不能用static
      

  7.   

    Parallel.For只是语法糖,性能反而不如你自己控制多线程得好,你那么在意性能,就不应该用这个方法。
      

  8.   

    最好再给你个性能上的建议,.NET里面有List,但是如果你用Array代替List,例如int[100]代替List<int>,性能会有提升,因为List<int>内部有一个私有的int[],在扩容过程中不断自我创建大数组,小数组内容往大数组里面复制,由于数组的这个复制就直接用的连续内存拷贝,快得你感觉不到这个过程,但是也是有性能损失的,而且比你所说的使用托管堆的性能损失更大。
      

  9.   

    平时我就是个懒人,技术没学会,偷懒没少弄。所以能语法糖的,就实在不想折腾了。谢谢各种提醒!又被caozhy大大送了一次分,好人啊!