首页 / C# / c# – 查找sizeof类型的对象?
c# – 查找sizeof类型的对象?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 查找sizeof类型的对象?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2650字,纯文字阅读大概需要4分钟。
内容图文
![c# – 查找sizeof类型的对象?](/upload/InfoBanner/zyjiaocheng/787/4e07e9c5cf554251823b50256ed52bb3.jpg)
我定义了这个结构
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指定大小(以字节为单位).
现在,如果我们进行数学运算,我们会看到:
> Int32有32位,因此有4个字节.
> Int64有64位,因此有8个字节.
>两个枚举都在一个字节上编码,因此是1个字节.
一共那是1 1 4 8因此14个字节.
但是:大多数系统不喜欢使用字节:它们使用字(16位)或双字(32位)来获取和存储数据.由于最小化数据结构会导致操作切断数据并对其进行重新处理,因此它会包含拖尾零.
如果您因此使用此类系统,则编译器可能希望将数据打包在16位(或更高)的块中.这些更容易:如果您想要访问数组中的元素,则不必将两个单词提取到内存中,因为结构在单词之间被分割.
用于演示数据打包方式的实验:
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类型的对象?全部内容,希望文章能够帮你解决c# – 查找sizeof类型的对象?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。