C ++指定Struct的实际大小

时间:2015-12-07 13:28:10

标签: c++ struct sizeof memory-alignment packing

我遇到了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个字节?

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:0)

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

这样的序列化库