开发者

What is the most efficient way to reassign a struct?

I have in my program a struct type called Square which is used to represent the location (int Rank, int File) of a square on a chess board.

If I assign Square by new Square sq(); say and then I want to reassign it, is it better to do so by

sq = new Square(rank, file);

or b开发者_如何学Cy writing an internal Set method and calling Set thus

sq.Set(rank, file);

What I am asking is when you use new on a struct, does the runtime reallocate new memory and call the constructor or does it reuse the existing memory? If it does the former then it would be better to write a Set method to avoid overheads would it not? Cheers.


The traditional thinking these days is the value types should be immutable, so you would not want to have a Set method unless that is returning a new Square object and not mutating the original. As such,

sq = new Square(rank, file);

And

sq = sq.GenerateSquare(rank, file); // renamed Set method from original question to appease comments

Should ultimately perform the same operation.

But given this approach, GenerateSquare would also possibly be better as a static method of Square rather than something depending upon any given instance. (An instance method would be more useful if something about the existing instance was used in the creation of a new instance.)


Structures are value types, so a simple assignment will do the job:

Square sq = new Square(rank, file);
Square anotherSq = sq;


Worrying about the weight of garbage collection or memory use is something you should not be concerned with until you have profiled your application and know it will be an issue. A simple structure like this is not going be taking up much space and likely not the cause of problems if your program does hit a bottleneck.


For structs... space for new structs is created on the stack, (see NOTE), not the heap, and is not subject to garbage collection. If the assignment variable is an already existing copy of the struct, then it is overwritten. No additional memory is used.

NOTE: If you create a new struct and assign it to a variable that is a property of a reference type, then yes, the reference type is on the heap, but the memory slot the struct is copied to is the already existing memory slot for that already existing reference type, no new heap memory is allocated. And the struct is not independantly subject to garbage collection....

But others' comments about your design are correct, structs should generally only be used for immutable domain objects, things that are simple and easy to create (small footprint) and have no identity (i.e., one telephone number object set to (802) 123-4567 is equivilent to and can be used anywhere else you need a telephone number object set to (802) 123-4567

So in general, these objects should not have constrcutors or property setters, they should have static factory methods that create instances of them.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜