如何计算Nullable数据类型

本文关键字:数据类型 Nullable 何计算 计算 | 更新日期: 2023-09-27 18:11:03

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

int ?=内存大小?

双吗?=内存大小?

bool吗?=内存大小?

谁能告诉我它们的存储空间或者计算它们大小的方法?

如何计算Nullable<T>数据类型

我相信,答案就在这里

基本上,在非空对象的大小上加上bool值的大小。

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

您想知道例如int? x的内存消耗吗?MSDN说:

…的基础上分配存储空间应用程序所在平台的特征执行。在某些情况下,它将声明的元素打包为尽可能紧密地在一起的;在其他情况下,它会对齐他们的记忆地址到自然硬件边界。另外,存储分配是在64位平台上与在32位平台上不同。

同样的考虑也适用于复合数据类型的每个成员例如结构或数组。此外,还有一些复合类型有额外的内存需求。例如,数组使用extra数组本身和每个维度的内存。在32位上平台,这个开销目前是12字节加上每个8字节维度。在64位平台上,需求翻了一番。你不能的标称存储分配加在一起就可以了组件。

引用任何基本或组合数据类型的Object使用4除数据类型中包含的数据之外的字节数。