Если это не огромный тип значения или тип экземпляра (то есть много тысяч полей), единственные типы, о которых вам нужно беспокоиться, - это большие массивы или строки. Конечно, чтобы выяснить размер массива, вам нужно знать размер элемента.
.NET (в настоящее время) выравнивает типы почти так же, как нативные компиляторы выравнивают типы. Фундаментальные типы имеют естественные выравнивания, которые, как правило, представляют собой округленную интегральную степень двух ближайших к их размеру:
Single, Int32, UInt32 - 4
IntPtr, UIntPtr, pointers, references - 4 on 32-bit, 8 on 64-bit
Double, Int64, UInt64 - 8
Char, Int16, UInt16 - 2
Byte, SByte - 1
При сборке типа компилятор будет следить за тем, чтобы все поля любого данного типа имели начальное смещение в экземпляре, выровненное по границе, соответствующей этому типу, при условии, что явное расположение не используется.
Сами определяемые пользователем типы имеют выравнивание, которое рассчитывается как наибольшее выравнивание среди всех типов полей. Размер шрифта увеличивается при необходимости, чтобы размер шрифта был выровнен.
Но, конечно, все ссылочные типы по-прежнему имеют размер и выравнивание только IntPtr.Size, поэтому размер ссылочного типа не повлияет на массивы этого типа.
Обратите внимание, что CLR может по своему усмотрению выбирать типы макетов не так, как описано выше, возможно, для увеличения местоположения кэша или уменьшения заполнения, требуемого выравниванием.