Pregunta

Tengo un ensamblado de .NET de 32 bits que PInvokes en la capa C. Quiero puerto de esta asamblea a 64 bits. He leído muchos documentos relacionados con la migración a 64 bits, todo lo cual parece sugerir que tenemos que cuidar de la alineación si vamos a utilizar estructuras.

Yo tenía una pregunta general relacionada con la estructura de alineación y quería aclarar que primero, para que yo no pierda nada.

Supongamos que tengo un punto de entrada C que acepta un puntero struct y básicamente llena los valores dentro. Este código C no tiene ningún directivas de embalaje y tengo todas las estructuras alineadas .NET para empacar = 8. Así que si paso una estructura con ints adyacentes, pensé que podría ser un problema interpretación de los datos de población en la capa de .NET, como el C por defecto utilizaría pack = 4 y estamos interpretar la struct como paquete = 8 en .NET capa, así que pensé que podría causar un problema. Pero no parece ser el caso. Los datos parecen ser interpretado bien.

Puede alguien explicar este comportamiento?

Gracias,   Niranjan

¿Fue útil?

Solución

Me encontré con este artículo de MSDN http://msdn.microsoft.com/en-us /library/aa366769(VS.85).aspx

Se sugiere que la especificación de un nivel de embalaje más grande que la alineación natural de un tipo no cambia la alineación tipo. Así que desde la alineación natural en el caso anterior he mencionado es 4, que define el embalaje a 8 no cambia realmente la alineación de la estructura. Esto explica el comportamiento.

Otros consejos

De forma predeterminada, los miembros de una estructura o unión están alineados en sus límites naturales; un byte para un char, dos bytes para un corto, cuatro bytes para un número entero etc. Si n está presente, debe ser una potencia de 2 especificando la alineación natural más estricta para cualquier estructura o unión miembro.

Por ejemplo, #pragma pack (2) se alinea int, largo, largo, largo, flotante, doble, doble de largo, y dos punteros en límites de bytes en lugar de sus límites de armonización natural. Si n es igual o mayor que la alineación más estricta en su plataforma, (cuatro en x86, ocho en SPARC v8, y 16 en v9 SPARC), la directiva tiene el efecto de alineación natural.

No estoy seguro de si la arquitectura x86 es compatible con la alineación de 8 bytes a pesar de que soportan un entorno de 64 bits. Después de todo, la alineación de 4 bytes en una plataforma de 64 bits no dañaría nada.

También puede utilizar: #pragma alinear 8 (variable) para indicar al compilador cómo desea que una variable global o estática alineados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top