Przede wszystkim mały disclaimer przed właściwym pytaniem:Jaka jest różnica między sizeof (T) i Unsafe.SizeOf <T>()?
Wiem, że istnieje wiele zamkniętych/powielać pytania dotyczące różnicy pomiędzy operatorem
sizeof
i sposobuMarshal.SizeOf<T>
i rozumiem różnicę między dwójka. Tutaj mówię o metodzieSizeOf<T>
w nowymUnsafe
klasy
tak, to nie jestem pewien, czy rozumiem rzeczywistą różnicę między tymi dwoma procesami, a także czy istnieje specyficzna różnica przy użyciu metody na struct/klasa w szczególności.
Operator sizeof
bierze nazwę Type i zwraca liczbę bajtówzarządzany jest podobno zająć kiedy przydzielane (tj. Int32
powróci 4, na przykład).
Sposób Unsafe.SizeOf<T>
z drugiej strony, jest realizowany w IL jak wszystkich innych metod w klasie Unsafe
, a patrząc na kod oto co robi:
.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
}
Teraz, jeśli nie jestem źle, kod wywołuje tylko sizeof !!T
, który jest taki sam jak sizeof(T)
(wywołanie operatora sizeof
o nazwie typu T
), więc czy oba nie byłyby dokładnie równoważne?
Widzę również, że metoda polega również na przydzielaniu bezużytecznego obiektu (NonVersionableAttribute
) w pierwszym wierszu, więc czy nie spowoduje to, że niewielka ilość pamięci zostanie również przydzielona do sterty?
Moje pytanie brzmi:
Czy można bezpiecznie powiedzieć, że te dwie metody są całkowicie równoważne i że w związku z tym jest to po prostu lepiej użyć klasycznego operatora
sizeof
, jak również uniknąć podziału tego atrybutu w metodaSizeOf<T>
? Czy ta metoda została dodana do klasySizeOf<T>
do klasyUnsafe
tylko dla wygody?
Opcja '.custom' oświadczenie tylko mówi, że tam jest obecny niestandardowy atrybut przynależności do tej metody. Ponieważ atrybuty niestandardowe są po prostu metadanymi, nie biorą udziału w zwykłym wywołaniu metody. – thehennyy
Po prostu wyjaśnienie, czy jest to klasa BCL, nie jestem świadomy, lub niektóre [rozszerzenie strony trzeciej] (https://github.com/DotNetCross/Memory.Unsafe)? Masz rację, że nic nie robi, być może chodziło o zapewnienie "haka" dla niektórych platformowych magii w przyszłości? – Groo
@Groo Jest to nowa klasa, która została dodana do CoreFX Wierzę w .NET Core 2.0 (nie do końca pewny, ale tak czy owak jest w .NET Core 2.0). Zobacz tutaj: https://docs.microsoft.com/it-it/dotnet/api/system.runtime.compilerservices.unsafe?view=netcore-2.0 – Sergio0694