HomeSearch

C# fixed Statement

This C# program uses the fixed statement in an unsafe code block.
Fixed. The fixed statement fixes memory in one location. Objects in memory are moved at almost any time. This makes garbage collection possible.
But when we use unsafe pointers to memory addresses, that memory must not be moved. With fixed we can use pointers without interfering with GC.
An example. This program must be compiled with unsafe code allowed. You can set this option in Visual Studio. It introduces the Transform method, which gets a random string.

Then: The program uses the fixed statement to ensure that the garbage collector does not relocate the string data.

Fixed: Inside the fixed statement is a block of code. The string data pointed to by the char* pointer will not be moved.

And: This means we can manipulate that memory however we like. In the example, we increment the value of each character.

Loop: The program adds 1 to each character in the string. It does this through pointer manipulation.

C# program that uses fixed statement on string using System; class Program { static void Main() { Console.WriteLine(Transform()); Console.WriteLine(Transform()); Console.WriteLine(Transform()); } unsafe static string Transform() { // Get random string. string value = System.IO.Path.GetRandomFileName(); // Use fixed statement on a char pointer. // ... The pointer now points to memory that won't be moved. fixed (char* pointer = value) { // Add one to each of the characters. for (int i = 0; pointer[i] != '\0'; ++i) { pointer[i]++; } // Return the mutated string. return new string(pointer); } } } Output 61c4eu6h/zt1 ctqqu62e/r2v gb{kvhn6/xwq
Notes, performance. There is a small cost to using the fixed statement. So it will only help on operations that spend significant amounts of time in unsafe code.
A warning. Optimizing with the fixed statement and pointer manipulation is often trial-and-error. It may make C# programs slower due to the transition from movable to fixed memory.

Thus: If you are optimizing, make sure to benchmark all the unsafe changes you make.

Benchmark

Info: Thanks to Amit Jha for pointing out that fixed statements can lead to performance improvements in certain situations.

A summary. Fixed is used with array elements, integer fields, and any data that is classified as movable—meaning it could be moved in memory during GC. This is a complex optimization.Unsafe
© 2007-2019 Sam Allen. Every person is special and unique. Send bug reports to info@dotnetperls.com.
Home
Dot Net Perls