выравнивание структуры по коду порта на 64-битный - PullRequest
0 голосов
/ 12 февраля 2009

У меня есть 32-битная сборка .NET, которая PInvokes в слой C. Я хочу портировать эту сборку на 64-битную. Я прочитал много документов, связанных с портированием на 64-битные системы, и все они, похоже, предполагают, что нам нужно позаботиться о выравнивании, если мы хотим использовать структуры.

У меня был общий вопрос, связанный с выравниванием структуры, и я хотел сначала уточнить его, чтобы я ничего не пропустил.

Предположим, у меня есть точка входа C, которая принимает указатель структуры и в основном заполняет значения внутри. Этот код C не имеет никаких директив упаковки, и у меня все .NET-структуры выровнены по pack = 8. Поэтому, если я передаю структуру со смежными целочисленными значениями, я думаю, что это может быть проблемой при интерпретации данных, заполняемых на уровне .NET, поскольку C по умолчанию будет использовать pack = 4, а мы интерпретируем структуру как pack = 8 в .NET. слой, поэтому думал, что это может вызвать проблемы. Но, похоже, это не так. Данные, похоже, интерпретируются нормально.

Кто-нибудь может объяснить это поведение?

Спасибо, Niranjan

Ответы [ 2 ]

0 голосов
/ 24 сентября 2009

По умолчанию члены структуры или объединения выравниваются по своим естественным границам; один байт для символа, два байта для короткого, четыре байта для целого числа и т. д. Если присутствует n, это должна быть степень 2, указывающая самое строгое естественное выравнивание для любой структуры или члена объединения.

Например, #pragma pack (2) выравнивает int, long, long long, float, double, long double и указатели на двухбайтовых границах вместо их естественных границ выравнивания. Если n равно или больше строгого выравнивания на вашей платформе (четыре на x86, восемь на SPARC v8 и 16 на SPARC v9), директива имеет эффект естественного выравнивания.

Я не уверен, поддерживает ли архитектура x86 8-байтовое выравнивание, хотя они поддерживают 64-битную среду. В конце концов, 4-байтовое выравнивание на 64-битной платформе не повредит.

Вы также можете использовать: #pragma align 8 (переменная), чтобы сообщить компилятору, как вы хотите выровнять глобальную или статическую переменную.

0 голосов
/ 20 февраля 2009

я наткнулся на эту статью msdn http://msdn.microsoft.com/en-us/library/aa366769(VS.85).aspx

Предполагается, что указание уровня упаковки, превышающего естественное выравнивание типа, не изменяет выравнивание типа. Таким образом, поскольку естественное выравнивание в вышеупомянутом случае, о котором я упоминал, равно 4, установка упаковки на 8 не меняет выравнивание структуры. Это объясняет поведение.

...