当前位置:  开发笔记 > 编程语言 > 正文

C++指定Struct的实际大小

如何解决《C++指定Struct的实际大小》经验,为你挑选了1个好方法。

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



1> gnasher729..:

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

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

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

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


我不同意; PInvoke及其提供的属性完全是为了支持这种场景,而Win32 C++编译器除了准确允许与系统API和COM ABI的互操作性之外,还有额外的保证.大多数Win32 <=> .NET管道都是通过PInvoke完成的,通过使用适当的PInvoke声明,通常会对非平凡的`struct`进行透明编组.
推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有