Joao Carlos
Joao Carlos

Reputation: 797

Class VS ref Struct

I am programming a game using C#, thus, I am very concerned about performance.

I would like to know what are the main differences, and if possible, performance considerations of using either a Class to pass data around, or a struct passed by reference.

I wish not to copy the data around, for performance reasons (I assume passing by ref is much faster than by value here).

I know that a class is always passed by reference and that a struct is passed by value, but I talking about passing the struct by reference here.

An example of the data I wish to pass :

    public delegate void PathCompleteDelegate(List<PathFinderNode> path);
public struct PathFinderJob{
    public PathCompleteDelegate callback;
    public Vector3 start, end;
    public PathSize unitSize;
    public BoxCollider boxCollider;
}

In the previous example, would using a class make a difference? If so, what would the difference be? Would a class be faster than a struct in this example? Why?

Thank you. Joao Carlos

Upvotes: 13

Views: 7939

Answers (2)

Graham Clark
Graham Clark

Reputation: 12966

I know that a class is always passed by reference and that a struct is passed by value, but I talking about passing the struct by reference here.

You probably have the right idea, but this is incorrect. Everything in C# is passed by value unless you use the ref keyword.

Class instances are reference types, struct instances are value types.

When you pass a reference type by value, you pass a copy of the reference (small). When you pass a value type by value, you pass a copy of the whole data (potentially large).

Jon Skeet has a good explanation of all this here.

Upvotes: 13

zmbq
zmbq

Reputation: 39023

Your delegate receives a reference type - a List, so you're passing the entire list by reference anyway.

Passing a large structure by value is definitely most expensive than passing just the reference. When you have a large structure, it usually doesn't make sense to use it as a structure, just turn it into a class.

Anyway, are you sure you'll have a performance issue here? Seems like a very premature optimization.

Upvotes: 3

Related Questions