C ++ Укажите фактический размер структуры

Я столкнулся с проблемой взаимодействия между 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 байт?

4

Решение

Вы передаете данные между двумя разными компиляторами. В общем, сделать такой матч невозможно. Особенно если вы переносите данные с одного компьютера на другой.

Сначала напишите спецификацию для данных, которые вы передаете. Спецификация НЕ МОЖЕТ быть структурой C ++ или C #. Например, спецификация должна быть чем-то вроде «четыре байта это, четыре байта это, два байта третье …» и так далее «всего 20 байтов».

Затем, используете ли вы C ++ или C #, или же совершенно другой разработчик использует код Objective C для чтения данных, вы читаете массив из 20 байтов, берете 20 байтов, просматриваете их и заполняете любую структуру, которую хотите, этими байт. А для письма ты делаешь обратное. Теперь не имеет значения, какой компилятор C ++ вы используете, какие странные прагмы вы используете, это просто работает.

Или используйте что-нибудь портативное, например, JSON.

5

Другие решения

Вы не можете взаимодействовать таким образом. Объект C # и структура C ++ различны. Я предлагаю вам использовать библиотеку сериализации, такую ​​как Capt’n Proto или Protobuf.

0

По вопросам рекламы [email protected]