如何计算Nullable <t>数据类型的大小</t>

时间:2013-04-25 13:41:08

标签: c# asp.net .net c#-4.0

实际上,我愿意知道以下数据类型消耗了多少内存

INT? =内存大小?

双? =内存大小?

BOOL? =内存大小?

任何人都可以向我提供有关其存储的信息或计算其大小的方法

3 个答案:

答案 0 :(得分:2)

我相信答案是here

基本上,添加一个bool大小的非可空的大小。

答案 1 :(得分:2)

您可以使用以下代码在运行时获取实际大小。返回的值将与数组int?[]的元素对齐相同,这与CLI的sizeof操作码(ECMA-335分区I,§8.9.1)返回的值一致。由于可空类型被视为引用类型,因此即使在不安全的上下文中也不能使用C#sizeof运算符。相反,我们使用TypedReference和2元素数组来计算相同的信息。

public static int SizeOf<T>()
{
    T[] array = new T[2];
    TypedReference elem1 = __makeref(array[0]);
    TypedReference elem2 = __makeref(array[1]);

    unsafe
    {
        byte* address1 = (byte*)*(IntPtr*)(&elem1);
        byte* address2 = (byte*)*(IntPtr*)(&elem2);
        return (int)(address2 - address1);
    }
}

然后您可以使用以下内容。

// This returns 8 on my test, but the runtime is free to change this to
// any value greater than sizeof(int)+sizeof(bool)
int nullableSize = sizeof(int?);

答案 2 :(得分:1)

你想知道例如的记忆消耗吗?一个int? x? MSDN说:

  

...公共语言运行库根据分配来分配存储   您的应用程序所在平台的特征   执行。在某些情况下,它将您声明的元素打包为   尽可能紧密地在一起;在其他情况下,它会调整记忆   地址到自然硬件边界。此外,存储分配是   在64位平台上比在32位平台上有所不同。

     

相同的注意事项适用于复合数据类型的每个成员   例如结构或数组。此外,还有一些复合类型   有额外的内存要求。例如,数组使用额外的   数组本身以及每个维度的内存。在32位上   平台,这个开销目前是12个字节加上每个8字节   尺寸。在64位平台上,需求增加了一倍。你不能   依靠简单地将标称存储分配加在一起   组件。

     

引用任何基本或复合数据类型的对象使用4   字节以及数据类型中包含的数据。