Прежде всего, небольшая оговорка перед актуальным вопросом:
Я знаю, что существует много закрытых/повторяющихся вопросов относительно разницы между оператором
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
только для удобства в этот момент?