gpt4 book ai didi

c# - StructLayout Pack=1 不适用于 bool?

转载 作者:太空狗 更新时间:2023-10-29 17:35:08 24 4
gpt4 key购买 nike

小测验:下面的程序打印了什么?

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication2 {

[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Struct1 {
bool b;
int i;
}

[StructLayout(LayoutKind.Sequential, Pack=1)]
struct Struct2 {
byte b;
int i;
}

class Program {
static void Main(string[] args) {
Console.WriteLine(Marshal.SizeOf(typeof(Struct1)));
Console.WriteLine(Marshal.SizeOf(typeof(Struct2)));
Console.ReadKey();
}
}
}

回答:

8
5

这让我很困惑。 bool 和 byte 的大小都是 1 个字节,指定 [StructLayout(LayoutKind.Sequential, Pack=1)] 应该可以消除任何填充问题。两个结构都应该是 5 个字节。所以我有两个问题:

  • 为什么编码以这种方式工作?
  • 有什么解决方法吗?我在需要导入的 native 结构中有 1 字节 bool 值。当然,我可以使用 byte,但它“很乱”。

谢谢。

最佳答案

默认情况下,.NET 类型 bool 编码为非托管类型 BOOL,它被 typedef 编辑为 int .如果您想编码 1 字节非托管 bool 值,请使用属性向编码器表明这一点:

[StructLayout (LayoutKind.Sequential, Pack=1)]
struct Struct3 {
[MarshalAs (UnmanagedType.I1)]
bool b;
int i;
}

Console.WriteLine (Marshal.SizeOf (typeof (Struct3))) ; // prints 5

关于c# - StructLayout Pack=1 不适用于 bool?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9766403/

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