gpt4 book ai didi

c# - 编码包含 boolean 值的复杂嵌套结构

转载 作者:行者123 更新时间:2023-11-27 23:05:36 24 4
gpt4 key购买 nike

我需要对多个嵌套结构进行复杂的编码(marshal)处理,将可变长度数组包含到其他结构中,因此我决定使用 ICustomMarshaler (请参阅 JaredPar 的教程 here)。但是后来我遇到了一个用 C++ 定义的结构的问题:

typedef struct AStruct{
int32_t a;
AType* b;
int32_t bLength;
bool aBoolean;
bool bBoolean;
};

在 C# 方面,在 ICustomMarshalerMarshalManagedToNative 实现中,我使用了:

Marshal.WriteByte(intPtr, offset, Convert.ToByte(aBoolean));
offset += 1;
Marshal.WriteByte(intPtr, offset, Convert.ToByte(bBoolean));

但它不起作用,因为我发现 C++ 结构中的每个 bool 占用 2 个字节。实际上在 x86 中 sizeof(AStruct) = 16,而不是 14。好的,bool 不能保证占用 1 个字节,所以我尝试使用 unsigned charuint8_t 但大小仍然是 16。

现在,我知道我可以使用 int32 而不是 boolean 值,但由于我关心占用的空间并且有几个包含流向磁盘的 boolean 值的结构(我使用 HDF5 文件格式并且我想将这些 boolean 值映射到HDF5库中定义的H5T_NATIVE_UINT8占用1个字节),还有其他方法吗?我的意思是我可以在保证占用 1 个字节的结构中包含一些东西吗?

编辑

同样的问题也适用于 int16 值:由于对齐原因,取决于存在的值的数量,最后结构的大小可能与预期的不同。在 C# 方面,我没有“看到”C++ 结构,我只是按照 C++ 中的结构定义在非托管内存上写入。这是一个非常简单的过程,但如果我不得不考虑结构占用的实际空间(通过猜测或测量),每次修改结构时都会变得更加困难并且容易出错。

最佳答案

这个答案是对 Hans Passant 所说内容的补充。

让您的结构使用固定的包装尺寸可能是最简单的,这样您就可以很容易地预测成员布局。请记住,这可能会影响性能。

此答案的其余部分特定于 Microsoft Visual C++,但大多数编译器都提供了它们自己的变体。

要开始,请查看此 SO 答案 #pragma pack effect和 MSDN http://msdn.microsoft.com/en-us/library/2e70t5y1.aspx

您经常使用的是 pragma pack(push, ...) 后跟 pragma pack(pop, ...) 习惯用法,只影响打包两个 pragma 之间定义的结构:

#pragma pack(push, 4)
struct someStructure
{
char a;
int b;
...
};
#pragma pack(pop)

这将使 someStructure 的每个成员都有一个可预测的 4 字节对齐包装。

编辑:来自 MSDN 打包页面

The alignment of a member will be on a boundary that is either a multiple of n or a multiple of the size of the member, whichever is smaller.

因此对于 pack(4)char 将在 1 字节边界上对齐,short 将在 2 字节边界上对齐,其余的在 4 字节边界上。

哪个值最好取决于您的情况。您需要显式打包您打算访问的所有结构,并且可能是您要访问的结构成员的所有结构。

关于c# - 编码包含 boolean 值的复杂嵌套结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23800447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com