Прежде всего, небольшая оговорка перед актуальным вопросом:
Я знаю, что существует много закрытых/повторяющихся вопросов относительно разницы между оператором
sizeofиMarshal.SizeOf<T>, и я понимаю разницу между ними. Здесь я говорю о методеSizeOf<T>в новом классеUnsafe
Итак, я не уверен, что понимаю реальную разницу между этими двумя операциями и имеет ли конкретное различие при использовании метода в struct/class в частности.
Оператор sizeof принимает имя Тип и возвращает число управляемых байтов, которое предполагается использовать при распределении (т.е. Int32 вернется 4, например).
Метод Unsafe.SizeOf<T>, с другой стороны, реализован в IL, как и все другие методы класса Unsafe, и просматривая здесь код:
.method public hidebysig static int32 SizeOf<T>() cil managed aggressiveinlining
{
.custom instance void System.Runtime.Versioning.NonVersionableAttribute::.ctor() = ( 01 00 00 00 )
.maxstack 1
sizeof !!T
ret
}
Теперь, если я не ошибаюсь, код просто вызывает sizeof !!T, который является таким же, как sizeof(T) (вызывает оператор sizeof с именем типа T), так что бы не два из них в точности эквивалентны?
Кроме того, я вижу, что метод также выделяет бесполезный объект (NonVersionableAttribute) в первой строке, так что это не будет причиной выделения небольшой части памяти?
Мой вопрос:
Можно ли сказать, что эти два метода абсолютно эквивалентны, и поэтому лучше использовать классический оператор
sizeof, так как это также позволяет избежать выделения этого атрибута в методеSizeOf<T>? Был ли этот методSizeOf<T>добавлен в классUnsafeтолько для удобства в этот момент?