Como regla general, a las CPU les gusta tener variables alineadas en la memoria en una ubicación que es un múltiplo par de su tamaño, por lo que un entero de cuatro bytes debe estar en una dirección de memoria divisible por cuatro y un ocho -byte long
debe estar en una dirección divisible por ocho.
Los diseñadores de lenguaje C# (y C++) lo saben, e insertarán relleno en las estructuras para proporcionar la alineación necesaria. Por lo que el diseño real de su estructura se parece a esto:
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
}
Puedes solucionar este problema haciendo que el tiempo que el primer valor, por regla general, si siempre pone los valores más grandes en el comienzo de sus estructuras, que ganó No se ha insertado ningún relleno para preservar la alineación de los miembros.
También se puede arreglar añadiendo
[StructLayout(LayoutKind.Sequential, Pack = 4)]
antes de la declaración de la estructura, sino que dará lugar a mal alineada long time
lo que perjudica el rendimiento.En algunas CPU, duele bastante el rendimiento. (El ALPHA AXP podría fallar en miembros desalineados, por ejemplo). x86 Las CPU solo tienen una pequeña penalización de rendimiento, pero existe el peligro de que las futuras CPU tengan una importante penalización de rendimiento, por lo que es mejor diseñar sus estructuras para alinearlas correctamente (en lugar de empaquetarlas) si es posible.
Ver aquí: http://www.vsj.co.uk/articles/display.asp?id=501 –