2013-04-25 31 views
1

其实,我很愿意知道多少内存是由以下数据类型如何计算可空的大小<T>数据类型

INT消耗? =内存大小?

double? =内存大小?

bool? =内存大小?

任何人可以给我讲述了他们储存或使用方法的信息来计算其规模

+0

它没有得到任何答复,必须有一个确切的答案,每个人只是从不同的博客复制和粘贴答案。他们不喜欢的事件 – 2013-04-26 03:54:18

回答

1

您是否想知道记忆体的消耗量?一个int? x? MSDN说:

...公共语言运行库分配基于您的应用程序是 执行平台的 特性存储。在某些情况下,它尽可能将您声明的元素尽可能紧密地包装在一起,即 ;在其他情况下,它将内存地址与自然硬件边界对齐。此外,在64位平台上的存储分配不同于在32位平台上的 。

同样的考虑适用于复合数据类型 的每个成员,如结构或数组。此外,某些复合类型 还有额外的内存要求。例如,数组使用额外的 内存用于数组本身,也用于每个维度。在32位的 平台上,此开销当前为12个字节加上每个 维度的8个字节。在64位平台上,需求增加了一倍。您不能 依赖于简单地将 组件的名义存储分配相加。

除了包含在数据类型中的数据之外,引用任何基本或复合数据类型的对象还使用4个 个字节。

+0

Mithrandir能否请你以一般方式解释以上内容,因为我想知道的是双重吗?(可为空)将占用32位计算机上的多少字节,以及在64位计算机上占用多少双倍(可空双精度)。 – 2013-04-25 13:59:59

+0

实际尺寸可能因系统而异。您可以使用sizeof()在运行时获取实际值,但那又如何? – Mithrandir 2013-04-25 14:06:50

+0

请尝试,如果你可以,因为我已经尝试过,但我不能我已经试过每一个愚蠢的把戏 – 2013-04-25 14:12:45

2

的答案,我相信,是here

基本上,增加的对大小非空的大小布尔。

1

您可以使用以下代码在运行时获取实际大小。返回的值将与数组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?); 
+0

绝对错误的答案请不要误导上述代码将不会被编译 – 2013-04-25 14:06:11

+0

当然它编译。您需要在项目的“构建”选项中勾选“允许不安全代码”。 – Andez 2016-04-11 12:36:50