是否可以使用“a = new type(...);”其中type是例程中的小结构

时间:2012-03-27 11:21:35

标签: c# performance memory-management

我一直在思考如何在某些特定情况下处理内存,我将解释( C#4.0 )。

首先,我读了Eric Lippert个答案,以便知道什么时候会被调用 我对 struct

类型的变量使用 new

现在,我想知道编译器是否“生成”特定使用关键字的智能代码

准确地说,如果在返回指令上设置了,或者甚至在运营商 = 上设置了什么?

假设我们有一个结构Coord定义如下:

struct Coord {
    int x, y;
    public Coord(int xx, int yy) {
        x = xx;
        y = yy;
    }
}

我将使用这个结构来存储具有几何行为的类(假设我们称之为实体)中的位置和速度

实体定义如下:

class Entity {
    private Coord m_pos, m_vel;
    //...
    public Entity() {
        // ...
    }

    public Coord Position {
        get {
            return m_pos;
        }
        set {
            m_pos = value;
        }
    }

    public Coord Velocity {
        get {
            return m_vel;
        }
        set {
            m_vel = value;
        }
    }
}

我的主程序包含一个例程,它只是简单地更新我的实体(以及它们的位置和速度)

现在我的问题是:如果我决定使用 new 更新这两个成员,价格是多少:

Entity a; // initialized

...

private Coord getNewPosOf(Entity e) {
   ...
   return new Coord(computed_x, computed_y);
}

public void routine() {
    a.Velocity = new Coord(x_vel, y_vel);
    a.Position = getNewPosOf(a);
}

该代码是否会在短期存储中分配内存,因此也会将值从构造函数复制到a的内存位置。或者编译器会采取 关心事物并避免在特定情况下分配和复制内存?

注意:我感觉我的行为有问题,也许我不应该使用Properties来编辑我的Coord类型的成员(或者最糟糕的是,我可能不会使用 属性正确,还有另一种方法可以做我想要的事情)

1 个答案:

答案 0 :(得分:3)

  

我想知道编译器是否“生成”特定使用new关键字的智能代码。确切地说,如果在返回指令上设置new,甚至在operator =?

上设置了什么呢?

首先,你应该澄清你的意思是“编译器”。将C#编译为IL的C#编译器,或将IL编译为机器代码的jit编译器?

如果你想知道C#编译器做了什么试试看。使用ILDASM查看C#编译器的输出。请记住,/ optimize开关在某些情况下可以大量改变生成IL的内容。

要查看抖动产生的代码,首先要确定哪个抖动与您相关;紧凑的框架,32位桌面,64位桌面,Silverlight等,都有不同的紧张情绪。

接下来,确定您是对抖动的调试输出还是完全优化的输出感兴趣。

如果您想查看完全优化的输出,那么您还有一些工作要做。编写一个程序,调用您想要查看一次的代码的方法,然后然后在第二次调用之前将调试器附加到它。抖动知道何时连接调试器并生成不同的代码以使其更容易调试,因此如果您想知道在调试时发生了什么,则必须触发抖动之前,它知道附加了一个调试器。