gpt4 book ai didi

c# - 查找 sizeof 类型的对象?

转载 作者:太空狗 更新时间:2023-10-30 01:34:52 25 4
gpt4 key购买 nike

我定义了这个结构

public enum E1 : byte
{
A,
B,
C
}

public enum E2 : byte
{
D,
E,
F
}

[StructLayout(LayoutKind.Sequential, Pack=4)]
public struct SomeStruct
{
public Int32 _var1; //4 byte
public E1 _var2; //1 byte(because Pack is 4 this will take 4 byte)
public E2 _var3; //1 byte(because Pack is 4 this will take 4 byte)
public UInt64 _var4; //8 byte
}

现在,因为我添加了 Pack=4 的 StructLayout 属性,所以我希望我定义的每个变量都将保持数据字段的对齐方式为 4。

所以我希望

 int val = Marshal.SizeOf( typeof( SomeStruct ) );

但我检查了代码,发现 val 是 16

那怎么可能呢?
我的误会在哪里?

最佳答案

SizeOf 指定以字节为单位的大小。

现在,如果我们进行数学计算,我们会看到:

  • Int3232 位,因此 4 字节。
  • Int6464 位,因此 8 字节。
  • 两个 enum 都在一个字节上编码,因此 1 字节。

加起来是 1+1+4+8 因此 14 字节。

但是:大多数系统不喜欢使用字节:它们使用words(16 位)或dwords(32 位)。由于最小化数据结构会导致切断数据并重新插入数据的操作,因此它包含尾部零。

如果您因此在这样的系统上工作,编译器可能喜欢将数据打包成 16 位(或更高位)的 block 。这些更容易:例如,如果您想要访问数组中的元素,则不必将两个单词提取到内存中,因为该结构被拆分为单词。

演示数据打包方式的实验:

using System.Runtime.InteropServices;

namespace Foo {

public enum E1 : byte
{
A,
B,
C
}

public enum E2 : byte
{
D,
E,
F
}


[StructLayout(LayoutKind.Sequential,Pack=4)]
public struct SomeStruct
{
public int _var1; //4 byte
public byte _var2; //1 byte(because Pack is 4 this will take 4 byte)
public byte _var3; //1 byte(because Pack is 4 this will take 4 byte)
public ulong _var4; //8 byte

public SomeStruct (int var1, byte var2, byte var3, ulong var4) {
this._var1 = var1;
this._var2 = var2;
this._var3 = var3;
this._var4 = var4;
}

}

}

Foo.SomeStruct i = new Foo.SomeStruct(1302,5,17,1425);
Marshal.SizeOf( typeof( Foo.SomeStruct ) );
sizeof(Foo.SomeStruct);
int size = sizeof(Foo.SomeStruct);
byte[] result = new byte[size];
IntPtr buffer = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(i, buffer, false);
Marshal.Copy(buffer, result, 0, size);

结果:

{ 22, 5, 0, 0, 5, 17, 0, 0, 145, 5, 0, 0, 0, 0, 0, 0 }

结构因此被编码为:

0                32   40   48       64                              128
+----------------+----+----+--------+--------------------------------+
| _var1 | _v2| _v3| ------ | _var4 |
+----------------+----+----+--------+--------------------------------+

如果您使用 int/uint 对变量进行编码,则得到:

{ 22, 5, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 145, 5, 0, 0, 0, 0, 0, 0 }

或:

0       32        64       96      128              192
+--------+--------+--------+--------+----------------+
| _var1 | _var2 | _var3 | ------ | _var4 |
+--------+--------+--------+--------+----------------+

关于c# - 查找 sizeof 类型的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28569357/

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