Для массивов структур / значений у меня разные результаты:
first = Marshal.UnsafeAddrOfPinnedArrayElement(array, 0).ToInt64();
second = Marshal.UnsafeAddrOfPinnedArrayElement(array, 1).ToInt64();
arrayElementSize = second - first;
(упрощенный пример)
Каким бы ни был подход, вам действительно нужно понимать, как работает .Net, чтобы правильно интерпретировать результаты. Например, возвращаемый размер элемента - это размер «выровненного» элемента с некоторым отступом. Накладные расходы и, следовательно, размер различаются в зависимости от использования типа: «в коробке» в куче сборщика мусора, в стеке, как поле, как элемент массива.
(Я хотел знать, какое влияние на память окажет использование «фиктивных» пустых структур (без какого-либо поля) для имитации «необязательных» аргументов универсальных шаблонов; выполняя тесты с различными макетами, включающими пустые структуры, я вижу, что пустая структура использует ( по крайней мере) 1 байт на элемент; я смутно помню, что это потому, что .Net нужен другой адрес для каждого поля, что не сработало бы, если бы поле действительно было пустым / размером 0).