结构中指针字段的大小

时间:2017-02-12 23:45:24

标签: c# pointers struct sizeof structlayout

我必须定义一个结构使用不安全的代码,所以我必须设置每个字段的FieldOffset值。但我无法定义指针的大小。这是代码:

[StructLayout(LayoutKind.Explicit)]
public struct SomeStructO
{
    public SomeStructO(int theNumber)
    {
        TheNumber = theNumber;
        Coordinates = PointF.Empty;
        SomeNumbers = null;
    }

    [FieldOffset(0)]
    public PointF Coordinates;

    [FieldOffset(sizeof(float) * 2)]
    public int[] SomeNumbers;

    [FieldOffset(sizeof(float) * 2 + IntPtr.Size)]
    public int TheNumber;
}

给出错误,因为IntPtr.Size不是常量表达式 当然,这个也不会编译:

Marshal.SizeOf(typeof(IntPtr))

当涉及问题标题时,更多的是我如何设置特定的" 32位64位编译" FieldOffset定义中的指针数据大小。

编辑:我也不能把" public int [] SomeNumbers;"结构末尾的字段,因为我的结构中有2个不同的数组..例如" public int [] SomeOtherNumbers;"

2 个答案:

答案 0 :(得分:0)

我最终在我的项目中添加了一个符号,并使用int和long size来声明指针大小

[StructLayout(LayoutKind.Explicit, Pack = 2)]
public struct VertexO
{
    public VertexO(Vector location)
    {
        Location = location;
        Neighbours = new IntListO();
        Triangles = new IntListO();
    }
    public VertexO(float x, float y, float z) : this(new Vector(x, y, z)) { }

    [FieldOffset(0)]
    public Vector Location;

    [FieldOffset(sizeof(float) * 3)]
    public IntListO Neighbours;

    #if WIN64
    [FieldOffset(sizeof(float) * 3 + (sizeof(int) * 2 + sizeof(long)))]
    #else
    [FieldOffset(sizeof(float) * 3 + (sizeof(int) * 2 + sizeof(int)))]
    #endif
    public IntListO Triangles;
}

IntList是另一个具有2个int和1个指针字段的结构:

    [StructLayout(LayoutKind.Explicit, Pack = 2)]
public struct IntListO
{

    //public IntListO()
    //{
    //    Handle = IntPtr.Zero;
    //    FCount = 0;
    //    SizeOfItem = sizeOfItem;
    //    FCapacity = 0;
    //}

    private static int ItemSize = 4;//size of integer

    [FieldOffset(0)]
    private int FCount;

    [FieldOffset(sizeof(int))]
    private int FCapacity;

    [FieldOffset(sizeof(int) * 2)]
    private IntPtr Handle;
}

所以

#if WIN64
[FieldOffset(sizeof(float) * 3 + (sizeof(int) * 2 + sizeof(long)))]
#else
[FieldOffset(sizeof(float) * 3 + (sizeof(int) * 2 + sizeof(int)))]
#endif

我实际上能够获得正确的指针大小。

Bytheway我使用" Pack = 2"最合理地对齐字节。默认情况下它是0并且当我使用Marshal.SizeOf(typeof(VertexO))时它增加了额外的大小,并且我测试了一些顶点和三角形测试,它工作得很好。

谢谢你们

答案 1 :(得分:-1)

  

使用不安全的代码,所以我必须设置每个的FieldOffset值   字段

为什么需要为每个字段指定FieldOffset?如果在StructLayout属性中使用LayoutKind.Sequential和相应的包大小,则不需要像使用LayoutKind.Explicit那样指定确切的FieldOffset。

这样的事情可能就是你想要的:

onAuthStateChanged