Я столкнулся с проблемой взаимодействия между C # и C ++, когда я разделяю память между двумя «сторонами» моего приложения через структуру, определенную как в собственном, так и в управляемом коде. Структура на нативной стороне определяется так:
#pragma pack(push, 1)
struct RayTestCollisionDesc {
btVector3 hitPosition;
btRigidBody* hitBody;
RayTestCollisionDesc(btRigidBody* body, btVector3& position)
: hitBody(body), hitPosition(position) { }
};
#pragma pack(pop)
И аналогичная структура определена на управляемой (C #) стороне. На C # размер структуры составляет 20 байт (как я и ожидал в 32-битной системе). Однако, несмотря на pragma pack
директива, размер структуры для размера C ++ все еще 32. Для ясности вот sizeof()
из C ++ каждого из этих типов:
sizeof(btVector3) : 16
sizeof(btRigidBody*) : 4
sizeof(RayTestCollisionDesc) : 32
очевидно pragma pack
имеет в виду только упаковку между членами структуры, а не заполнение в конце структуры (то есть выравнивание). Я также попытался добавить __declspec(align(1))
но это не имело никакого эффекта, и сам MSDN говорит «__declspec (align (#)) может только увеличить ограничения выравнивания.»
И FWIW я использую компилятор VS2013 (Platform Toolset v120).
Есть ли способ увеличить размер структуры до 20 байт?
Вы передаете данные между двумя разными компиляторами. В общем, сделать такой матч невозможно. Особенно если вы переносите данные с одного компьютера на другой.
Сначала напишите спецификацию для данных, которые вы передаете. Спецификация НЕ МОЖЕТ быть структурой C ++ или C #. Например, спецификация должна быть чем-то вроде «четыре байта это, четыре байта это, два байта третье …» и так далее «всего 20 байтов».
Затем, используете ли вы C ++ или C #, или же совершенно другой разработчик использует код Objective C для чтения данных, вы читаете массив из 20 байтов, берете 20 байтов, просматриваете их и заполняете любую структуру, которую хотите, этими байт. А для письма ты делаешь обратное. Теперь не имеет значения, какой компилятор C ++ вы используете, какие странные прагмы вы используете, это просто работает.
Или используйте что-нибудь портативное, например, JSON.
Вы не можете взаимодействовать таким образом. Объект C # и структура C ++ различны. Я предлагаю вам использовать библиотеку сериализации, такую как Capt’n Proto или Protobuf.