Untuk array struct / nilai, saya memiliki hasil yang berbeda dengan:
first = Marshal.UnsafeAddrOfPinnedArrayElement(array, 0).ToInt64();
second = Marshal.UnsafeAddrOfPinnedArrayElement(array, 1).ToInt64();
arrayElementSize = second - first;
(contoh yang terlalu disederhanakan)
Apa pun pendekatannya, Anda benar-benar perlu memahami cara kerja .Net untuk menafsirkan hasil dengan benar. Misalnya, ukuran elemen yang dikembalikan adalah ukuran elemen "selaras", dengan beberapa padding. Overhead dan ukurannya berbeda-beda bergantung pada penggunaan tipe: "boxed" pada GC heap, di stack, sebagai field, sebagai elemen array.
(Saya ingin tahu apa yang akan menjadi dampak memori menggunakan struct kosong "dummy" (tanpa bidang apa pun) untuk meniru argumen "opsional" generik; membuat tes dengan tata letak berbeda yang melibatkan struct kosong, saya dapat melihat bahwa struct kosong menggunakan ( setidaknya) 1 byte per elemen; saya samar-samar ingat itu karena .Net membutuhkan alamat yang berbeda untuk setiap bidang, yang tidak akan berfungsi jika bidang benar-benar kosong / berukuran 0).