实际上,我很想知道以下数据类型消耗了多少内存
诠释?= 内存大小?
双倍的?= 内存大小?
布尔?= 内存大小?
谁能给我有关他们的存储或计算其大小的方法的信息
答案,我相信,就在这里
基本上,将布尔大小添加到不可为空的大小。
您可以使用以下代码在运行时获取实际大小。返回的值将与数组的元素对齐方式相同int?[]
,这与 CLI 的操作码返回的值一致sizeof
(ECMA-335 Partition 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?);
你想知道例如 a 的内存消耗int? x
吗?MSDN 说:
...公共语言运行时根据您的应用程序正在执行的平台的特征分配存储。在某些情况下,它会将您声明的元素尽可能紧密地打包在一起;在其他情况下,它将它们的内存地址与自然硬件边界对齐。此外,64 位平台上的存储分配与 32 位平台上的不同。
相同的考虑适用于复合数据类型的每个成员,例如结构或数组。此外,某些复合类型具有额外的内存要求。例如,数组为数组本身以及每个维度使用额外的内存。在 32 位平台上,此开销目前是 12 字节加上每个维度的 8 字节。在 64 位平台上,要求翻倍。您不能依赖简单地将组件的名义存储分配相加。
引用任何基本或复合数据类型的对象除了数据类型中包含的数据外,还使用 4 个字节。