为什么sizeof(Point)是8?

3

我编写了代码,但结果很奇怪——整数i的值是8:

unsafe
        {
            int i = sizeof(Point);
        }

检查结构体Point后,我发现以下字段:

    public bool IsEmpty { get; }
    public int X { get; set; }
    public int Y { get; set; }

位数运算:32+32+1 = 65位,所以大于8字节。

那么,为什么sizeof返回的是8而不是9呢?

谢谢。

2个回答

10

IsEmpty是一个属性(property),而不是字段(field)。属性只是方法在幕后的表现形式,因此它们不属于结构体的大小。


是的,你写得对!我尝试做:结构体 SomeVal { public Int32 x; public Int32 y; public bool z; }它的大小是12!变量的最小块是4个字节吗? - zzfima
2
@zzfima 不是这样的... 试试 struct Test { bool Value; } 只有1个字节。你看到的是额外的填充,因为 SomeVal 必须在4字节边界上对齐(因为它包含一个 Int32),所以它的大小必须是4的倍数。 - xanatos
2
请注意,填充要求因平台而异,CLR在成员顺序方面没有像C和C++那样的规则,有时会省略大部分必要的填充。 - Joey
除非有人用枪指着我,否则我永远不会考虑数据的内部处理方式。当然,有些头疼的情况是无法避免的。但在这种情况下,我有一个重要的业务需要在国外呼叫... - Mario Vernari
1
@Joey 但请注意,对于 struct,C# 编译器会发出 [StructLayout(LayoutKind.Sequential, Size = 1)](参见 http://goo.gl/V6qH4Y)(请注意,这是 C# 编译器执行的操作...不能保证其他 .NET 语言会执行相同的操作) - xanatos

5

Point框架实现 仅使用了两个属性:

private int x;
private int y; 

Empty 是这样实现的:

[Browsable(false)]
public bool IsEmpty { 
    get {
        return x == 0 && y == 0;
    }
} 

两个 int 字段占用了8个字节 - 一切都很好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接