实际上,我愿意知道以下数据类型消耗了多少内存
INT? =内存大小?
双? =内存大小?
BOOL? =内存大小?
任何人都可以向我提供有关其存储的信息或计算其大小的方法
答案 0 :(得分:2)
基本上,添加一个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 字节以及数据类型中包含的数据。