什么时候结构太大了?

Big*_*tty 3 c# struct class

可能重复:
C#中的结构与类

很抱歉,如果这是一个开放式问题,但我只是想知道我的结构是否太大了.我想要使​​用结构的原因是因为我已经知道它们比类更快,我认为我真的需要速度.

我发现如果你的结构太大,它实际上会减慢你的程序,所以我想知道这个指南是什么以及我的结构是否需要转换为类.

public struct Tiles
{
    public Rectangle rect;

//i know this wont run with them being initalized like this but if i change to a class this will 
//stay like this and im in the middle of deciding what to do

    Bitmap currentPic = new Bitmap(50, 50);
    ImageAttributes imgAttr = new ImageAttributes();
    float[][] ptsArray;
    ColorMatrix clrMatrix;

    public void setTiles(int i, int k, int width, int height)
    {
        Rectangle temp = new Rectangle(i, k, width, height);
        rect = temp;

        float[][] ptsTemp ={
         new float[] {1, 0, 0, 0, 0},
         new float[] {0, 1, 0, 0, 0},
         new float[] {0, 0, 1, 0, 0},
         new float[] {0, 0, 0, .9f, 0},
         new float[] {0, 0, 0, 0, 1}};

        ptsArray = ptsTemp;
        clrMatrix = new ColorMatrix(ptsArray);
        currentPic = The_Great_Find__Dig_Deeper.Properties.Resources.darknessflashlight;
    }

    public void setTransperancy(float value)
    {
        clrMatrix.Matrix33 = value;
    }

    public void drawRect(Graphics g)
    {
        imgAttr.SetColorMatrix(clrMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

        g.DrawImage(currentPic, rect, 0, 0, currentPic.Width, currentPic.Height, GraphicsUnit.Pixel, imgAttr);
    }

    bool blackened
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该把它换成课吗?它对我来说有点臃肿.我正在使用Visual Studio 2008.

Raf*_*afe 8

对非黑带程序员的建议:不要优化代码.

对黑带程序员的建议:稍后优化您的代码.

认真地建议你留意这个建议!

为了给你一些更相关的解释,你应该知道,与类不同,结构是在堆栈上分配的,而不是在堆上.堆栈分配稍微便宜一些,但通常只适用于短期或按值传递或将要存储在大型数组中的小型对象.

如果您不知道通过值传递的内容,则意味着只要将整个结构作为参数传递给方法,就会复制整个结构.如果您的结构不是很小,这很快就会变得非常昂贵.如果您不理解这种区别,它还可能导致意外行为:对方法中的参数所做的更改对方法调用者是可见的; 对方法中的struct参数所做的更改对方法调用者可见(因为该方法正在更改原始数据的副本).

重申我的第一点:除非你确定你知道你在做什么,否则不要使用结构.

希望这可以帮助!

  • `结构在堆栈上分配,而不是堆` - 这是一个常见的错误.CLR中值类型(结构)的分配行为要复杂得多.请阅读:http://stackoverflow.com/questions/4853213/c-struct-stack-allocated-or-sometimes-heap-allocated/4853251#4853251 (9认同)
  • **结构不能合理地说是在堆栈上分配**.静态字段,实例字段,匿名函数的封闭本地,迭代器块的本地或数组内部的结构不会在堆栈上分配.优化为寄存器的结构不会在堆栈中分配.每个人都忘了参考!引用的*referant*永远不会在堆栈中,但*reference*经常在堆栈上.为什么每个人都总是忘记参考?他们可以占用大量的筹码.或者注册. (6认同)
  • 事物的*种类*决定分配位置的整个想法在表面上是无稽之谈.显然,在短寿命存储(堆栈)或长寿命存储(堆)上分配的东西取决于它的*生存期*,而不是存储是按值还是通过引用复制的! (5认同)
  • 此外,您认为堆栈分配"更便宜"的论点似乎令人怀疑.通过移动GC堆指针的顶部,为什么通过移动堆栈指针进行分配比分配更贵或更便宜?费用不是*堆分配*; 费用是堆分配的副作用,即*收集压力*导致更频繁的垃圾收集. (5认同)

Cha*_*ert 2

先发制人的优化是万恶之源。俗话说得好。构建您的应用程序,只有在出现性能问题时才尝试修复它们。例如,一种方法的运行速度可能是另一种方法的两倍,但您可以并行化第一个方法并一次运行 4 个方法。因此第一种方法实际上更快。您必须先充分了解您的性能问题,然后才能解决它。

回答你的问题:据我所知,当传递给方法时,大小为 16 字节或更大的结构比类慢。