标签: struct-vs-class

什么时候结构的答案?

我正在做一个光线跟踪器爱好项目,最初我使用的是我的Vector和Ray对象的结构,我认为光线跟踪器是使用它们的完美情况:你创造了数百万个它们,它们的寿命不长于单个方法,它们很轻巧.但是,通过简单地在Vector和Ray上将'struct'更改为'class',我获得了非常显着的性能提升.

是什么赋予了?它们都很小(Vector为3个浮点数,Ray为2个向量),不要过度复制.当然,我确实将它们传递给方法,但这是不可避免的.那么在使用结构时会导致性能下降的常见缺陷是什么?我已阅读 MSDN文章,其中说明如下:

运行此示例时,您将看到struct循环的速度提高了几个数量级.但是,当您将ValueTypes视为对象时,请注意使用ValueTypes.这会给你的程序增加额外的装箱和拆箱开销,并且最终会比你坚持使用物品时花费更多!要查看此操作,请修改上面的代码以使用foos和bar数组.你会发现性能或多或少相等.

然而它已经很老了(2001年)而整个"把它们放在一个阵列导致拳击/拆箱"让我觉得奇怪.真的吗?但是,我确实预先计算了主光线并将它们放在一个数组中,所以我接受了这篇文章,并在我需要时计算了主光线并且从未将它们添加到数组中,但它没有改变任何东西:课程,它仍然快1.5倍.

我正在运行.NET 3.5 SP1,我相信修复了一个问题,即struct方法没有内联,所以也不可能.

所以基本上:任何提示,需要考虑的事项和避免的事项?

编辑:正如在一些答案中所建议的那样,我已经设置了一个测试项目,我尝试将结构作为参考传递.添加两个向量的方法:

public static VectorStruct Add(VectorStruct v1, VectorStruct v2)
{
  return new VectorStruct(v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z);
}

public static VectorStruct Add(ref VectorStruct v1, ref VectorStruct v2)
{
  return new VectorStruct(v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z);
}

public static void Add(ref VectorStruct v1, ref VectorStruct v2, out VectorStruct v3)
{
  v3 = new VectorStruct(v1.X + v2.X, v1.Y + v2.Y, v1.Z + v2.Z);
}
Run Code Online (Sandbox Code Playgroud)

对于每个我得到以下基准方法的变体: …

c# performance struct raytracing struct-vs-class

32
推荐指数
6
解决办法
1万
查看次数

枚举器实现:使用struct还是class?

我注意到List<T>它将枚举器定义为a struct,同时ArrayList将其枚举器定义为class.有什么不同?如果我要为我的班级写一个调查员,哪一个更好?

编辑:我的要求无法使用yield,所以我正在实现我自己的枚举器.也就是说,我想知道是否更好地遵循这些方法List<T>并将其作为结构实现.

.net c# enumeration struct-vs-class

11
推荐指数
5
解决办法
5698
查看次数

为什么有Enumerator struct和EnumeratorImpl类?

我正在使用Reflector 查看Roslyn 2012年9月的CTP,我注意到ChildSyntaxList结构具有以下内容:

public struct ChildSyntaxList : IEnumerable<SyntaxNodeOrToken>
{
    private readonly SyntaxNode node;
    private readonly int count;

    public Enumerator GetEnumerator()
    {
        return node == null ? new Enumerator() : new Enumerator(node, count);
    }

    IEnumerator<SyntaxNodeOrToken> IEnumerable<SyntaxNodeOrToken>.GetEnumerator()
    {
        return node == null
            ? SpecializedCollections.EmptyEnumerator<SyntaxNodeOrToken>()
            : new EnumeratorImpl(node, count);
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return node == null
            ? SpecializedCollections.EmptyEnumerator<SyntaxNodeOrToken>()
            : new EnumeratorImpl(node, count);
    }

    public struct Enumerator
    {
        internal Enumerator(SyntaxNode node, int count)
        {
            /* logic */
        }

        public SyntaxNodeOrToken Current …
Run Code Online (Sandbox Code Playgroud)

c# struct-vs-class roslyn

4
推荐指数
1
解决办法
720
查看次数

定义/宏/结构和consts/funcs/classes之间的区别是什么?(C++)

我知道定义和常量之间的区别在于常量具有类型,而宏和函数之间,函数被调用和键入,而宏是无类型的内联.不是结构和类之间的区别,但我不认为有一个,除了公共/私有默认的东西(我在这里只考虑C++,而不是C).

无论如何,有没有时候使用定义/宏/结构比使用C++版本,常量,函数和类更有效,更有利,或者至少更干净的代码?

具体来说,因为这只是它们之间没有明显差异(至少在最终程序中),使用结构而不是类是否更好,如果没有效率,那么使用它们的惯例是什么?使用?

c++ backwards-compatibility struct-vs-class

2
推荐指数
1
解决办法
292
查看次数