结构尺寸

时间:2010-01-22 11:32:16

标签: c# struct

可以使用

获取struct的大小

Marshal.SizeOf(typeof(mystruct));

是否可以获得结构的一部分的大小(例如,我传递给结构的最后一个字段并返回先前字段的大小的总和)? 据我所知,可以使用反射吗?

3 个答案:

答案 0 :(得分:3)

[StructLayout(LayoutKind.Explicit)]
public struct SomeStruct
{
    [FieldOffset(0)]
    public byte b1;
    [FieldOffset(3)]
    public byte b2;
    [FieldOffset(7)]
    public int i1;
    [FieldOffset(12)]
    public int i2;
}

class Program
{
    static FieldOffsetAttribute GetFieldOffset(string fieldName)
    {
        return (FieldOffsetAttribute)typeof(SomeStruct)
            .GetField(fieldName)
            .GetCustomAttributes(typeof(FieldOffsetAttribute), false)[0];
    }

    static void Main(string[] args)
    {
        var someStruct = new SomeStruct { b1 = 1, b2 = 2, i1 = 3, i2 = 4 };

        Console.WriteLine("field b1 offset: {0}", GetFieldOffset("b1").Value);
        Console.WriteLine("field b2 offset: {0}", GetFieldOffset("b2").Value);
        Console.WriteLine("field i1 offset: {0}", GetFieldOffset("i1").Value);
        Console.WriteLine("field i2 offset: {0}", GetFieldOffset("i2").Value);

        Console.ReadLine();
    }
}

打印: 字段b1偏移量:0 字段b2偏移量:3 field i1 offset:7 field i2 offset:12

答案 1 :(得分:2)

.NET中无法发现结构的内存布局。 JIT编译器利用了这一点,它重新排序结构的字段以获得更高效的布局。这会破坏任何以绕过正常编组机制的方式使用结构的尝试。是的,Marshal.SiseOf()为结构生成一个大小。但是这个大小只有在使用Marshal.StructureToPtr()之后才有效。

直接回答你的问题:不,你无法发现大小,甚至没有反射。按设计。

答案 2 :(得分:1)

嗯,我不确定,但我认为由于可能的优化和对齐问题,这是不可能的。