C++ 指定结构的实际大小

C++ Specify Actual Size of Struct

我遇到了 C# 和 C++ 之间的互操作问题,我通过在本机代码和托管代码中定义的结构在我的应用程序的两个 'sides' 之间共享内存。 native端的struct是这样定义的:

#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 编译器(平台工具集 v120)。

有没有办法 'force' 结构大小为 20 字节?

您正在两个不同的编译器之间传输数据。总的来说,不可能做出这样的搭配。特别是当您将数据从一台计算机传输到另一台计算机时。

首先为您要传输的数据编写规范。规范不能是 C++ 或 C# 结构。例如,规范必须类似于 "four bytes this, four bytes that, two bytes a third thing..." 等等 "with a total of 20 bytes"。

那么无论你使用C++还是C#,或者完全不同的开发者是否使用Objective-C代码来读取数据,你读取一个20字节的数组,取出20个字节,查看它们,然后填充这 20 个字节是你想要的任何结构。而对于写作,你做相反的事情。现在,无论您使用什么 C++ 编译器,使用什么奇怪的编译指示,它都可以正常工作。

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

您不能以这种方式进行互操作。 C# 对象和 C++ 结构是不同的。我建议你使用像 Capt'n Proto 或 Protobuf

这样的序列化库