Zgodnie z ogólną zasadą, procesory lubią mieć zmienne wyrównane w pamięci w miejscu, które jest nawet wielokrotnością ich rozmiaru, więc czterobajtowa liczba całkowita powinna znajdować się na adresie pamięci podzielnym na cztery, a na osiem -byte long
powinno być pod adresem podzielnym przez osiem.
Projektanci języka C# (i C++) wiedzą o tym i będą wkładać wyściółkę w struktury, aby zapewnić niezbędne wyrównanie. Więc rzeczywisty układ swojej struktury wygląda następująco:
public struct NetPoint {
public float lat; // 4 bytes Offset 0
public float lon; // 4 bytes Offset 4
public int alt; // 4 bytes Offset 8
int to_preserve_alignment; // 4 bytes Offset 12
public long time; // 8 bytes Offset 16
}
Można rozwiązać ten problem poprzez długą pierwszą wartość, co do zasady, jeśli zawsze umieścić największe wartości na początku swoich struktur, wygrałeś włożono wkładkę, aby zachować wyrównanie elementów.
Można również naprawić dodając
[StructLayout(LayoutKind.Sequential, Pack = 4)]
przed deklaracji struktury, ale to spowoduje mis wyrównany long time
który boli wydajność.W przypadku niektórych procesorów bardzo często boli wydajność. (Na przykład ALPHA AXP spowodował błąd w przypadku źle wyrównanych elementów). x86 Procesory mają tylko nieznaczną obniżkę wydajności, ale istnieje niebezpieczeństwo, że przyszłe procesory będą miały znaczną karę za wydajność, więc najlepiej jest zaprojektować swoje struktury, aby odpowiednio dopasować (a nie je pakować), jeśli możesz.
Zobacz tutaj: http://www.vsj.co.uk/articles/display.asp?id=501 –