Я всегда понимал, что structs (типы значений) содержат точно количество байтов, как определено в полях структуры... однако я сделал несколько тестов и, похоже, существует исключение для пустых структур:
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;
}
}
Если вы запустите программу, вы обнаружите, что en FooStruct, у которого, очевидно, 0 байт данных будет потреблять 1 байт памяти. Причина для меня - проблема в том, что я хочу, чтобы Bar<FooStruct>
потреблял ровно 4 байта (потому что я собираюсь выделить его много).
Почему у этого есть это поведение, и есть ли способ исправить это (например, есть ли что-то особенное, которое потребляет 0 байт - я не ищу редизайн)?