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.

Другие вопросы по тегам