Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Struct vs Class for long lived objects

When you need to have very small objects, say that contains 2 float property, and you will have millions of them that aren't gonna be "destroyed" right away, are structs a better choice or classes?

Like in xna as a library, there are point3s, etc as structs but if you need to hold onto those values for a long time, would it pose a performance threat?

like image 257
Joan Venge Avatar asked Mar 03 '09 21:03

Joan Venge


People also ask

Is struct more efficient than class?

However, there are also important differences between structures and classes. Classes have the advantage of being reference types — passing a reference is more efficient than passing a structure variable with all its data.

Which is better struct or class?

There is no difference between classes and structs. Structs are classes; only default access is flipped from private to public.

What is the advantage of structure over class?

Structs are preferable if they are relatively small and copiable because copying is way safer than having multiple references to the same instance as happens with classes. This is especially important when passing around a variable to many classes and/or in a multithreaded environment.


4 Answers

Contrary to most questions about structs, this actually seems to be a good use of a struct. If the data it contains are value types, and you are going to use a lot of these, a structure would work well.

Some tips:

:: The struct should not be larger than 16 bytes, or you lose the performance advantages.

:: Make the struct immutable. That makes the usage clearer.

Example:

public struct Point3D {

   public float X { get; private set; }
   public float Y { get; private set; }
   public float Z { get; private set; }

   public Point3D(float x, float y, float z) {
      X = x;
      Y = y;
      Z = z;
   }

   public Point3D Invert() {
      return new Point3D(-X, -Y, -Z);
   }

}
like image 121
Guffa Avatar answered Oct 18 '22 18:10

Guffa


The answer depends on where the objects/values will eventually be stored. If they are to be stored in an untyped collection like ArrayList, then you end up boxing them. Boxing creates an object wrapper for a struct and the footprint is the same as with a class object. On the other hand if you use a typed array like T[] or List, then using structs will only store the actual data for each element with footprint for entire collection only and not its elements.

So structs are more efficient for use in T[] arrays.

like image 29
agsamek Avatar answered Oct 18 '22 17:10

agsamek


The big concern is whether the memory is allocated on the stack or the heap. Structs go in the stack by default, and the stack is generally much more limited in terms of space. So creating a whole bunch of structs just like that can be a problem.

In practice, though, I don't really think it's that big of a deal. If you have that many of them they're likely part of a class instance (on the heap) somewhere.

like image 2
Joel Coehoorn Avatar answered Oct 18 '22 19:10

Joel Coehoorn


Struct seems right for this application.

Bear in mind that the "need to hold onto those valueS" implies their storage on the heap somewhere, probably an array field of a class instance.

One thing to watch out for is that this results in a allocation on the large object heap. Its not that clear how, if at all, this heap defrags itself, however for very long lived objects that perhaps isn't an issue.

Using class for millions of these data types would likely be expensive in the shear volume of dereferencing that will likely be taking place for operations on this type.

like image 2
AnthonyWJones Avatar answered Oct 18 '22 18:10

AnthonyWJones