1

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

诠释?= 内存大小?

双倍的?= 内存大小?

布尔?= 内存大小?

谁能给我有关他们的存储或计算其大小的方法的信息

4

3 回答 3

2

答案,我相信,就在这里

基本上,将布尔大小添加到不可为空的大小。

于 2013-04-25T13:44:28.060 回答
2

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

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?);
于 2013-04-25T14:04:11.697 回答
1

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

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

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

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

于 2013-04-25T13:45:14.887 回答