【问题标题】:How to calculate size of Nullable<T> datatypes [duplicate]如何计算 Nullable<T> 数据类型的大小
【发布时间】:2013-04-19 10:37:34
【问题描述】:

其实我很想知道下面的数据类型消耗了多少内存

整数? = 内存大小?

双倍? = 内存大小?

布尔值? = 内存大小?

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

【问题讨论】:

  • 它没有得到正确的答案,必须有一个准确的答案,每个人只需复制并粘贴来自不同博客的答案。事件他们不

标签: c# asp.net .net c#-4.0


【解决方案1】:

我相信答案是here

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 绝对错误的答案请不要误导上面的代码不会被编译
    • 当然可以编译。您需要在项目的 Build 选项中勾选 Allow Unsafe Code。
    【解决方案3】:

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

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

    同样的注意事项适用于复合数据类型的每个成员 例如结构或数组。此外,一些复合类型 有额外的内存要求。例如,一个数组使用额外的 数组本身以及每个维度的内存。在 32 位 平台,这个开销目前是 12 个字节加上每个 8 个字节 方面。在 64 位平台上,要求翻倍。你不能 依靠简单地将标称存储分配相加 组件。

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

    【讨论】:

    • Mithrandir 能否请您在上面进行一般性解释,因为我只想知道双精度?(可空双精度)在 32 位机器上会占用多少字节以及双精度数?(可空双精度)会占用 64 位机器。
    • 实际大小可能因系统而异。您可以使用 sizeof() 在运行时获取实际值,但是接下来呢?
    • 如果可以,请尝试一下,因为我尝试过,但我无法尝试所有愚蠢的技巧
    猜你喜欢
    • 2011-09-20
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2014-07-21
    相关资源
    最近更新 更多