首页 文章

C指定Struct的实际大小

提问于
浏览
4

我遇到了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.为清楚起见,这里是每种类型的C的 sizeof()

sizeof(btVector3) : 16 
sizeof(btRigidBody*) : 4
sizeof(RayTestCollisionDesc) : 32

显然 pragma pack 仅指结构成员之间的打包,而不是结构末尾的填充(即对齐) . 我也尝试添加 __declspec(align(1)) ,但这没有效果,MSDN本身确实说"__declspec(align(#)) can only increase alignment restrictions."

FWIW我正在使用VS2013编译器(Platform Toolset v120) .

有没有办法将结构大小“强制”为20个字节?

2 回答

  • 0

    您正在两个不同的编译器之间传输数据 . 一般来说,这种匹配是不可能的 . 特别是如果您将数据从一台计算机传输到另一台计

    首先为要传输的数据编写规范 . 规范不能是C或C#结构 . 规范必须类似于“四个字节,四个字节,两个字节三分之一......”等等,例如“总共20个字节” .

    然后,无论你使用C还是C#,或者一个完全不同的开发人员是否使用Objective-C代码来读取数据,你读取一个20字节的数组,取20个字节,查看它们,并用这些20填充你想要的结构 . 字节 . 对于写作,你会做相反的事情 . 现在你使用什么C编译器,你正在使用什么奇怪的pragma并不重要,它只是工作 .

    或者使用像JSON这样便携的东西 .

  • 5

    你不能以这种方式互操作 . C#对象和C结构是不同的 . 我建议你使用像Capt'n Proto或Protobuf这样的序列化库

相关问题