我一直在试图找出什么时候在堆栈上分配的东西,我无法弄清楚你如何在堆栈上分配数组(或者更确切地说是值);
在这个例子中:
public void foo()
{
int bar[] = new int [10];
}
将在堆上分配10个int结构,只有指向它们的指针才会在堆栈上,对吗?
如何使固定大小的数组进入堆栈?如果我使用的是我定义的结果怎么办?
如果我希望将数组大小作为参数传递给函数怎么办?
据我所知,调用函数时,如果在调用函数时已知大小,则在堆栈上获取任意大小的数组应该没有问题。
我是否应该为此烦恼?据我所知,在堆栈上获取这个固定大小的数组会提高性能,因为没有完成堆分配。
答案 0 :(得分:15)
将在堆上分配10个int结构,只有指向它们的指针才会在堆栈上,对吗?
是的,没错。
如何使固定大小的数组进入堆栈?如果我使用我定义的结构会怎么样?
stackalloc
keyword就是为了这个目的。但是,这只适用于不安全的环境,这在大多数情况下都是一个相当不必要的限制因素,不值得进行性能权衡。
示例:
public void unsafe foo()
{
int* bar = stackalloc int [10];
}
您必须使用pointer arithmetic来访问阵列的成员。
如果我想将数组大小作为参数传递给函数怎么办? 据我所知,当调用函数时,如果在调用函数时已知大小,则在堆栈上获取任意大小的数组应该没有问题。
按预期工作:
public void unsafe foo(int length)
{
int* bar = stackalloc int [length];
}
我是否应该为此烦恼?据我所知,在堆栈上获取这个固定大小的数组会提高性能,因为没有完成堆分配。
不,一般不会。除非您处理一些非常具体的性能关键场景,例如繁重的数学计算,加密,压缩等,否则它不会带来任何实际好处。
另外,请参阅this question了解与效果相关的讨论。