这个C#结构的大小是多少?

时间:2010-09-27 14:11:54

标签: c# struct sizeof

存储在List<DataPoint>

时是12个字节还是16个字节
public struct DataPoint
{
    DateTime time_utc;
    float value;
}

C#中是否有sizeof函数?

6 个答案:

答案 0 :(得分:14)

请看看@Hans Passant的回答here,了解有关此问题的有趣背景,尤其是关于Marshal.Sizeof的限制。

答案 1 :(得分:7)

答案 2 :(得分:7)

CLR可以根据需要在内存中自由布局类型。所以不可能直接给出“尺寸”。

但是,对于结构,可以使用StructLayout Attribute来限制CLR的自由:

  • 自动:运行时会自动选择合适的布局。
  • 顺序:对象的成员按顺序排列,并根据 StructLayoutAttribute.Pack 值对齐。
  • 明确:明确控制每个成员的准确位置。

C#编译器会自动将顺序布局类型应用于任何结构。 x86或x64计算机上的 Pack 值分别默认为4或8。所以你的结构的大小是8 + 4 = 12(x86和x64)。


不相关从类型在内存中的布局方式来看,也可以使用Marshal Class封送.NET中的类型。编组器在编组类型时应用了几个转换,因此结果并不总是与CLR布局类型的方式相同。 (例如,bool在内存中占用1个字节加上对齐,而编组器将bool编组为4个字节。)

答案 3 :(得分:3)

它将是12个字节(浮点数为4,DateTime为8); Marshal.SizeOf将返回16,因为默认打包是8字节对齐。 This是关于结构和包装的好文章。它完整​​地描述了实际发生的事情。

答案 4 :(得分:0)

尝试使用Marshal.SizeOf(typeof(DataPoint))

答案 5 :(得分:0)

以下代码基于this StackOverflow question and answers

        /// <summary>
        /// Computes the size of the given managed type. Slow, but reliable. Does not give the same result as Marshal.SizeOf
        /// NOTE: this is not the same as what is the distance between these types in an array. That varies depending on alignment.
        /// </summary>
        public static int ComputeSizeOf(Type t)
        {
            // all this just to invoke one opcode with no arguments!
            var method = new DynamicMethod("ComputeSizeOfImpl", typeof(int), Type.EmptyTypes, typeof(Util), false);
            var gen = method.GetILGenerator();
            gen.Emit(OpCodes.Sizeof, t);
            gen.Emit(OpCodes.Ret);
            var func = (Func<int>)method.CreateDelegate(typeof(Func<int>));
            return func();
        }

我认为您可能想知道的问题不是类型的大小,而是列表中两个连续元素之间的距离是多少。正如其他人所提到的,这是因为对齐可以发挥作用。

我相信使用Marshal.UnsafeAddrOfPinnedArrayElement()可以最好地解决该问题,但是很难正确使用,尤其是因为List不会公开公开支持数组。