C++ Specify Actual Size of Struct
我遇到了一个C语言和C++之间的互操作问题,我通过在本地和托管代码中定义的结构来共享应用程序的两个"边"之间的内存。本机端的结构定义如下:
1 2 3 4 5 6 7 8 9 | #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位系统上所期望的那样)。然而,尽管EDOCX1的0度指令,在C++大小上的结构大小仍然是32。为了清楚起见,这里的每种类型的C++都有C++的1:
1 2 3 | sizeof(btVector3) : 16 sizeof(btRigidBody*) : 4 sizeof(RayTestCollisionDesc) : 32 |
显然,
和fwiw我正在使用vs2013编译器(平台工具集v120)。
是否有方法将结构大小"强制"为20字节?
您正在两个不同的编译器之间传输数据。一般来说,这是不可能的匹配。尤其是当你把数据从一台电脑传送到另一台电脑时。
首先为要传输的数据编写规范。SPEC不能是C++或C.*结构。例如,规范必须类似于"四个字节这个,四个字节那个,两个字节第三个…"等等"总共有20个字节"。
然后,无论你使用C++还是C++,还是完全不同的开发人员都使用Objto-C代码来读取数据,你读取一个20字节的数组,取20字节,看它们,用这20个字节填充你想要的任何结构。对于写作,你做的恰恰相反。现在,不管你使用什么C++编译器,你使用的是什么奇怪的语法,它都是有效的。
或者使用类似JSON的可移植的东西。
你不能这样做互操作。一个C对象和一个C++结构是不同的。我建议你使用一个系列化库,像proto或protobuf船长。