C ++指定Struct的实际大小

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

显然,pragma pack只指结构成员之间的填充,而不是结构末端的填充(即对齐)。我还尝试添加__declspec(align(1)),但这没有效果,而msdn本身也说"udeclspec(align())只能增加对齐限制。"

和fwiw我正在使用vs2013编译器(平台工具集v120)。

是否有方法将结构大小"强制"为20字节?


您正在两个不同的编译器之间传输数据。一般来说,这是不可能的匹配。尤其是当你把数据从一台电脑传送到另一台电脑时。

首先为要传输的数据编写规范。SPEC不能是C++或C.*结构。例如,规范必须类似于"四个字节这个,四个字节那个,两个字节第三个…"等等"总共有20个字节"。

然后,无论你使用C++还是C++,还是完全不同的开发人员都使用Objto-C代码来读取数据,你读取一个20字节的数组,取20字节,看它们,用这20个字节填充你想要的任何结构。对于写作,你做的恰恰相反。现在,不管你使用什么C++编译器,你使用的是什么奇怪的语法,它都是有效的。

或者使用类似JSON的可移植的东西。


你不能这样做互操作。一个C对象和一个C++结构是不同的。我建议你使用一个系列化库,像proto或protobuf船长。