Wykorzystanie refleksji do określenia, w jaki sposób typ .Net jest ułożony w pamięci

Eksperymentuję z optymalizacją kombinatorów parsera w języku C #. Jedną z możliwych optymalizacji, gdy format serializowany jest zgodny z formatem w pamięci, jest po prostu wykonanie (niebezpiecznej) pamięci danych, które mają być analizowane przez instancję lub nawet wiele instancji typu.

Chcę napisać kod, który określa, czy format w pamięci odpowiada formatowi serializowanemu, w celu dynamicznego określenia, czy można zastosować optymalizację. (Oczywiście jest to niebezpieczna optymalizacja i może nie zadziałać z całą masą subtelnych powodów. Po prostu eksperymentuję, nie planując użyć tego w kodzie produkcyjnym).

Używam atrybutu[StructLayout (LayoutKind.Sequential, Pack = 1)] aby wymusić brak dopełnienia i wymusić, aby zamówienie w pamięci pasowało do kolejności deklaracji. Sprawdzam ten atrybut z odbiciem, ale tak naprawdę wszystko to potwierdza „brak dopełnienia”. Potrzebuję też kolejności pól. (Zdecydowanie wolałbym nie podawać ręcznieFieldOffset atrybuty dla każdego pola, ponieważ byłoby to bardzo podatne na błędy.)

Zakładałem, że mogę użyć kolejności pól zwróconych przezGetFields, ale dokumentacja wyraźnie mówi, że zamówienie jest nieokreślone.

Biorąc pod uwagę, że wymuszam kolejność pól z atrybutem StructLayout, czy istnieje sposób na zastanowienie się nad tym porządkiem?

edytować Czuję się dobrze z ograniczeniem, że wszystkie pola muszą byćblittable.

questionAnswers(2)

yourAnswerToTheQuestion