Reputation: 797
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
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
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