struct c#和与之相关的内存

时间:2012-07-05 10:21:22

标签: c# memory-management struct

给出结构点:

public struct Point {
    double x, y;
    Point(double i, double j) {
        x=i;
        y=j;
    }
}

Q1 :我们之间的差异是什么:

Point p;

Point p=new Point(2.0,3.0);

据我所知,在第二部分中,匿名Point struct正在堆上分配,并且被逐位复制到堆栈上分配的p变量的内存中。我是对的吗?

Q2 :我需要做什么来携带对Point的引用,而不是在堆栈上分配并按值传递它? (不使用不安全的指针)

class Linear {
    private double m, n;
    ref Point p = new Point(2.0,3.0); // not compiling
} 

4 个答案:

答案 0 :(得分:1)

class Wrapper
{
    public Point Point { get; set; }
}

使用包装值类型(struct)的引用类型(类),您将在堆中分配它。

答案 1 :(得分:1)

A1:在第一个语句中,您只是声明变量,而不是像在第二个语句中那样创建结构的实例。

A2:您需要使用REF关键字,将对象“提供”给另一个方法,而不是声明变量的位置。

答案 2 :(得分:0)

如果我不想要一个valuetype结构,我通常会创建一个非常简单的类。对于你的例子,哪个看起来像下面的代码。在某些情况下,类会阻止struct boxing / unboxing性能命中。但是如果你有一个List<>结构它是所有数据的单个内存块。使用List<>你得到一个指向许多类实例的指针块。

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class Point
{
    public double x, y;

    public Point(double i, double j)
    {
        x = i;
        y = j;
    }
}

答案 3 :(得分:0)

在第二个语句中,创建了类型为Point的匿名临时存储位置,很可能是在堆栈上,并且它作为隐式ref参数传递给参数化构造函数。构造函数完成后,Point变量p通过用匿名临时字段中的相应字段覆盖每个字段(公共或私有)来进行变异,然后放弃。请注意,无论struct假装是不可变的,行为都是相同的。