我遇到了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个字节,查看它们,并用这些20填充所需的结构.字节.对于写作,你会做相反的事情.现在无论你使用什么C++编译器,你正在使用什么奇怪的pragma,它只是起作用.
或者使用像JSON这样便携的东西.