gpt4 book ai didi

c# 结构/类堆栈/堆控制?

转载 作者:可可西里 更新时间:2023-11-01 08:06:50 24 4
gpt4 key购买 nike

所以在 C++ 中这很容易。你想在堆上分配任何类/结构,使用新的。如果你想把它放在堆栈上,不要使用 new。

在 C# 中,我们总是使用 new 关键字,并且根据它是结构还是类,它被分配到堆栈或堆上(结构进入堆栈,类进入堆)——在某些应用程序中更改设计时可能会产生巨大的性能差异,这样只有那些对象才会进入真正属于那里的堆。

我想知道的是 - 有没有一种直接的方法来控制对象的分配位置,而不管它是声明为结构还是类?我知道值类型(结构)可以装箱以进入堆(但装箱/拆箱会以性能成本为代价)。有没有办法在堆栈上分配类?

此外,是否有任何机制可以分配原始内存并使用 C++ 中的 placement new 之类的东西?我知道这打破了被管理的想法 - 但如果您可以使用自定义内存管理,它可以产生很大的性能差异。

我喜欢 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 从结构更改为类,执行需要 8.9 秒!那慢了五倍

最佳答案

虽然在一般情况下,对象总是在堆上分配是正确的,但 C# 确实允许您下降到指针级别以进行繁重的互操作或非常高性能的关键代码。

unsafe block ,你可以使用 stackalloc在堆栈上分配对象并将它们用作指针。

引用他们的例子:

// cs_keyword_stackalloc.cs
// compile with: /unsafe
using System;

class Test
{
public static unsafe void Main()
{
int* fib = stackalloc int[100];
int* p = fib;
*p++ = *p++ = 1;
for (int i=2; i<100; ++i, ++p)
*p = p[-1] + p[-2];
for (int i=0; i<10; ++i)
Console.WriteLine (fib[i]);
}
}

但是请注意,您不需要声明整个方法不安全,您可以只为它使用一个unsafe {...} block 。

关于c# 结构/类堆栈/堆控制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2031258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com