Domanda

Ho un assembly .NET a 32 bit che PInvokes nello strato C. Voglio porto questa assemblea a 64 bit. Ho letto molti documenti relativi a porting a 64 bit, ognuno dei quali sembra suggerire che abbiamo bisogno di prendersi cura di allineamento, se vogliamo usare le strutture.

ho avuto una domanda di carattere generale relative alla struttura l'allineamento e volevo chiarire che prima in modo che io non mancare nulla.

Supponiamo di avere un punto di ingresso C che accetta un puntatore struct e fondamentalmente riempie i valori all'interno. Questo codice C non ha alcuna direttiva di imballaggio e ho tutte le struct .NET allineati per il confezionamento = 8. Quindi se passo una struttura con interi adiacenti, ho pensato che potrebbe essere un problema interpretare i dati popolate nello strato NET, come C per default userebbe pack = 4 e stiamo interpretando la struct come pack = 8 in NET strato, quindi pensato che potrebbe causare un problema. Ma non sembra essere il caso. I dati sembrano essere interpretato bene.

Qualcuno può spiegare questo comportamento?

Grazie,   Niranjan

È stato utile?

Soluzione

mi sono imbattuto in questo articolo di MSDN http://msdn.microsoft.com/en-us /library/aa366769(VS.85).aspx

Si suggerisce che specifica un livello maggiore del confezionamento allineamento naturale di un tipo non cambia l'allineamento tipo. Quindi, dal momento l'allineamento naturale nel caso di cui sopra ho accennato è 4, impostando l'imballaggio a 8 in realtà non modificare l'allineamento della struttura. Questo spiega il comportamento.

Altri suggerimenti

Per impostazione predefinita, i membri di una struttura o unione sono allineati sui loro confini naturali; un byte per un char, due byte per un breve, quattro byte per un intero ecc Se n è presente, deve essere una potenza di 2, che specificano stretto allineamento naturale per ogni membro della struttura o unione.

Per esempio, #pragma pack (2) allinea int, long, long long, float, double, long double, e indicazioni su due limiti di byte invece dei loro confini allineamento naturali. Se n è uguale o superiore alla più stretto allineamento sulla vostra piattaforma, (quattro su x86, otto su SPARC v8, e 16 su SPARC v9), la direttiva ha l'effetto di allineamento naturale.

Non sono sicuro se l'architettura x86 supporta l'allineamento a 8 byte, anche se supportano un ambiente a 64 bit. Dopo tutto, l'allineamento a 4 byte su una piattaforma a 64 bit non avrebbe fatto del male nulla.

È inoltre possibile utilizzare: #pragma allineare 8 (variabile) per dire al compilatore come si desidera una variabile globale o statico allineato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top