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 байт?
2 ответа
Вы передаете данные между двумя разными компиляторами. В общем, сделать такой матч невозможно. Особенно если вы переносите данные с одного компьютера на другой.
Сначала напишите спецификацию для данных, которые вы передаете. Спецификация НЕ МОЖЕТ быть структурой C++ или C#. Например, спецификация должна быть чем-то вроде "четыре байта это, четыре байта это, два байта третье..." и так далее "всего 20 байтов".
Затем, используете ли вы C++ или C#, или же совершенно другой разработчик использует код Objective C для чтения данных, вы читаете массив из 20 байтов, берете 20 байтов, просматриваете их и заполняете любую структуру, которую хотите, этими 20 байт. А для письма ты делаешь обратное. Теперь не имеет значения, какой компилятор C++ вы используете, какие странные прагмы вы используете, это просто работает.
Или используйте что-нибудь портативное, например, JSON.
Вы не можете взаимодействовать таким образом. Объект A C# и структура C++ различны. Я предлагаю вам использовать библиотеку сериализации, такую как Capt'n Proto или Protobuf.