2009-02-12 41 views
0

我有一個32位的.NET程序集,其中PInvokes到C層。我想將此程序集移植到64位。我已經閱讀了許多與移植到64位有關的文檔,所有這些似乎都表明,如果我們要使用結構,我們需要關注對齊。結構對齊到端口代碼爲64位

我有一個關於結構對齊的普遍問題,並且想先澄清一下,這樣我就不會錯過任何東西。

假設我有一個C入口點,它接受一個結構指針並基本填充裏面的值。這個C代碼沒有任何裝箱指令,我把所有的.NET結構都對齊到pack = 8。所以如果我傳遞一個結構與相鄰的整數,我認爲這可能是一個問題,解釋在.NET層中填充的數據,因爲默認情況下C會使用pack = 4,我們在.NET中將結構解釋爲pack = 8層,所以認爲它可能會導致一個問題。但似乎並非如此。數據似乎被解釋得很好。

任何人都可以解釋這種行爲?

感謝, NIRANJAN

回答

0

我來到這個MSDN文章 http://msdn.microsoft.com/en-us/library/aa366769(VS.85).aspx

這表明,指定包裝水平不是類型的自然對齊大不改變類型對準對面。因此,由於上面提到的情況中的自然對齊是4,因此將包裝設置爲8並不會真正改變結構的對齊方式。這解釋了這種行爲。

0

默認情況下,結構或聯合的成員在其自然邊界上對齊; char爲一個字節,short爲兩個字節,整數爲四個字節等。如果n存在,則它必須是2的冪,指定任何結構或聯合成員的最嚴格的自然對齊。例如,#pragma pack(2)在兩個字節邊界上對齊int,long,long long,float,double,long double和指針,而不是其自然對齊邊界。如果n等於或大於平臺上最嚴格的對齊方式(x86上有4個, SPARC v8上有8個,SPARC v9上有16個),則該指令具有自然對齊的效果。

我不確定x86架構是否支持8字節對齊,即使它們支持64位環境。畢竟,64位平臺上的4字節對齊不會損害任何內容。

您還可以使用:#pragma align 8(variable)告訴編譯器如何對齊全局或靜態變量。