返回首页

sizeof操作符和方法。让我讨论他们所提供的,它们之间的区别。对不起,如果我碰巧逛了一下。
之前我们解决sizeof和Marshal.SizeOf之间的差异,让我们讨论一下为什么我们要计算的变量或类型的大小。不是学术,一个典型的理由知道一个类型的大小(在生产代码)将一个项目数组分配内存,通常是同时使用{A}。在C(或者非托管世界),不同类型的大小计算,绝对没有使用在C#(管理世界)等。托管应用程序内,大小不事;因为是由CLR提供了创建\管理固定大小和可变大小的数组(类型)的类型。每MSDN,大小不能计算准确。这是否意味着我们不需要CLR中的世界时,在所有类型的大小来计算?显然没有,否则我不会写这篇文章。
值类型:?用户定义的值(引用类型)是由编译器公开的原始值类型组成,其中大部分存在关键字INT,BOOL,CHAR,长,双等自原始值类型是由编译器暴露出来,它们的大小是(预)由编译器(在平台上运行的CLR,并在此基础)定义。编译器允许查询的原始值类型的sizeof操作符的大小。 sizeof操作符返回类型的大小,以字节为单位,由CLR在当前平台上分配。请参阅{A2}为原始类型的大小。
然而,将sizeof不能自由使用用户定义的值类型(结构),但只有在满足以下条件: - 要求从一个不安全块内结构的大小。该结构不包含引用类型的成员。
由于引用类型的大小不能计算(见下面引用类型),结构的大小不能计算。结构是不是一个通用的价值类型。
SIZEOF应作为一个编译时构建可想而知。这意味着大小质疑应在编译时已知的类型。当我们说SIZEOF(GenValueType),(非公开)类型的定义GenValueType不是在编译时可用,但只在运行时。因此,编译器不允许计算的一般价值类型的大小。但可确定大小相同的封闭类型的一个实例。但最好不令人信服我,因为编译器使用MSIL SIZEOF指令到电脑的大小,而不是硬编码的大小(原始类型)。
此外,微妙的和痛苦的事情是,大小取决于其他因素,如包装尺寸({A3})。不像在C,SIZEOF接受只有一个(非公开)类型在编译时和不变量。
引用类型:引用类型使用sizeof操作符不能在。按照MSDN上,大小可以是误导或引用类型没有意义的。考虑包含一个字符和字符串类(引用类型)SomeClass的。引用类型基本上(三)指针一样。当计算SomeClass的大小,字符串成员方面应考虑 - 参考(4字节)或值(n字节)?此外,每个。NET对象,即被16(我猜)字节的报头开销。是否应该考虑头规模过同样的问题,这里也适用于 - 16个字节或头实际上指的是复杂的数据结构。因此,对于这样的原因,它不会使感参考使用SIZEOF(至少在编译时)类型的大小来确定的。另一种方法是把SIZEOF POD类型仅适用于。
鉴于这一切都在计算类型的大小(使用SIZEOF)的不确定性,将有过的需要,然后呢?在更广泛的意义上说,有一种情况。这就是当数据通过托管应用程序 - 互操作或自定义序列化等。例如,托管应用程序可能需要创建\填补调用本地API,作为其输入的数据结构,或将填充输出一个数据结构分配非托管内存。
让我们进入下半年(或更好的一半) - Marshal.SizeOf。 sizeof(C#关键字)的不同,这个人是从BCL提供。此方法返回的类型或它的实例的大小(字节),如果它已经存在在非托管世界。这种方法有两个重载 - 一个类型作为输入和其他实例。让我们说,我们要分配一些内存,在非托管堆中调用本地API(SendMessage函数orVirtualAlloc或ReadProcessMemory)。在许多情况下,被分配的内存量是相当于一个Win32结构LVITEM结构,STARTUPINFO或一个这样的。在这种情况下,Marshal.SizeOf方法,必须使用{诠释十= Marshal.SizeOf(typeof运算(LVITEM));},它返回的大小取决于应用StructLayoutAttribute结构。
Marshal.SizeOf方法用于参考和值类型?它可用于任何值类型,但在运行时会抛出一个例外,如果值类型包含引用类型。和错误是有意义的 - 类型不能作为非托管结构进行封送处理,可以计算出任何有意义的大小或偏移。否则,它可以用来与原始的或用户定义的值类型。它允许将引用类型仅用于类型的布局被指定为LayoutKind.Sequential或LayoutKind.Explicit,否则上述相同的异常将在运行时抛出。
,由sizeof和Marshal.SizeOf返回的大小是不同的,与字符的情况下,很可能。 sizeof(char)的的是2,因为CLR是一个Unicode的野兽。 Marshal.SizeOf(CHAR)将返回1,因为在非托管世界的字符占用一个字节。然而,Marshal.SizeOf(SomeStruct)可能会报告的char成员占用两个字节(默认),或占用一个字节(如果StructLayout.CharSet = CharSet.Ansi)。
我需要总结的东西吗?

回答

评论会员:c 时间:2