Ho sempre capito che le strutture (tipi di valori) contengono esattamente il numero di byte definito nei campi della struttura ... tuttavia, ho fatto alcuni test e sembra esserci un'eccezione per le struct vuoti:Perché una struttura vuota in C# consuma memoria
public class EmptyStructTest
{
static void Main(string[] args)
{
FindMemoryLoad<FooStruct>((id) => new FooStruct());
FindMemoryLoad<Bar<FooStruct>>((id) => new Bar<FooStruct>(id));
FindMemoryLoad<Bar<int>>((id) => new Bar<int>(id));
FindMemoryLoad<int>((id) => id);
Console.ReadLine();
}
private static void FindMemoryLoad<T>(Func<int, T> creator) where T : new()
{
GC.Collect(GC.MaxGeneration);
GC.WaitForFullGCComplete();
Thread.MemoryBarrier();
long start = GC.GetTotalMemory(true);
T[] ids = new T[10000];
for (int i = 0; i < ids.Length; ++i)
{
ids[i] = creator(i);
}
long end = GC.GetTotalMemory(true);
GC.Collect(GC.MaxGeneration);
GC.WaitForFullGCComplete();
Thread.MemoryBarrier();
Console.WriteLine("{0} {1}", ((double)end-start)/10000.0, ids.Length);
}
public struct FooStruct { }
public struct Bar<T> where T : struct
{
public Bar(int id) { value = id; thing = default(T); }
public int value;
public T thing;
}
}
Se si esegue il programma, troverete che en FooStruct che ovviamente ha 0 byte di dati consumerà 1 byte di memoria. Il motivo per cui questo è un problema per me è che voglio che lo Bar<FooStruct>
consumi esattamente 4 byte (perché ho intenzione di allocarlo molto).
Perché ha questo comportamento ed esiste un modo per risolvere questo problema (ad esempio c'è una cosa speciale che consuma 0 byte-- Non sto cercando una riprogettazione)?
P.S .: [StructLayout (LayoutKind.Explicit, Size = 0)] fornisce lo stesso risultato. – atlaste
GC.GetTotalMemory è preciso? Se è così ho sprecato soldi su un profiler di memoria. – Paparazzi
Perché non saltare semplicemente Bar e avere FooStruct include il valore int pubblico? – Paparazzi