我一直在思考如何在某些特定情况下处理内存,我将解释( 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类型的成员(或者最糟糕的是,我可能不会使用 属性正确,还有另一种方法可以做我想要的事情)
答案 0 :(得分:3)
我想知道编译器是否“生成”特定使用new关键字的智能代码。确切地说,如果在返回指令上设置new,甚至在operator =?
上设置了什么呢?
首先,你应该澄清你的意思是“编译器”。将C#编译为IL的C#编译器,或将IL编译为机器代码的jit编译器?
如果你想知道C#编译器做了什么试试看。使用ILDASM查看C#编译器的输出。请记住,/ optimize开关在某些情况下可以大量改变生成IL的内容。
要查看抖动产生的代码,首先要确定哪个抖动与您相关;紧凑的框架,32位桌面,64位桌面,Silverlight等,都有不同的紧张情绪。
接下来,确定您是对抖动的调试输出还是完全优化的输出感兴趣。
如果您想查看完全优化的输出,那么您还有一些工作要做。编写一个程序,调用您想要查看一次的代码的方法,然后然后在第二次调用之前将调试器附加到它。抖动知道何时连接调试器并生成不同的代码以使其更容易调试,因此如果您想知道在不调试时发生了什么,则必须触发抖动在之前,它知道附加了一个调试器。