所以在 c++ 中这很容易。您希望在堆上分配任何类/结构,请使用 new。如果你想要它在堆栈上,不要使用新的。
在 C# 中,我们总是使用 new 关键字,根据它是结构还是类,它被分配在堆栈或堆上(结构进入堆栈,类进入堆) - 在某些应用程序中可能有改变设计时巨大的性能差异使得只有那些对象进入真正属于那里的堆。
我想知道的是 - 有没有一种直接的方法来控制一个对象的分配位置,而不管它是声明为结构还是类?我知道可以将值类型(结构)装箱以进入堆(但装箱/拆箱是以性能为代价的)。有没有办法在堆栈上分配类?
此外,是否有任何机制来分配原始内存并使用 C++ 中的新位置之类的东西?我知道这与被管理的想法不同——但如果您可以使用自定义内存管理,它会产生很大的性能差异。
我喜欢 C# 的便利,因为它是垃圾收集器和其他东西 - 但有时,在处理应用程序的瓶颈时,可能希望对实际发生的事情有更多的控制。
欢迎任何提示/提示:)
编辑:性能示例:
struct Foo1
{
public int i;
public float f;
public double d;
}
struct Foo2
{
public Foo1[] bar;
public void Init(){
bar = new Foo1[100];
for (int i = 0; i < 100; i++)
bar[i] = new Foo1();
}
}
class Program
{
static void Main(string[] args)
{
DateTime time = DateTime.Now;
Foo2[] arr = new Foo2[1000000];
for (int i = 0; i < 1000000; i++)
{
arr[i] = new Foo2();
arr[i].Init();
}
Console.WriteLine((DateTime.Now - time).TotalMilliseconds);
}
}
这在我的机器上执行需要 1.8 秒(请注意,实际上只有分配正在进行 - 没有参数传递)
如果将 Foo1 从 struct 更改为 class,则执行需要 8.9 秒!慢了五倍