sizeof根据字段顺序给出不同的结果

时间:2013-06-04 21:00:38

标签: c# .net structure sizeof

我编写了一个小型控制台应用程序来测试sizeof运算符:

public class Program
{
    public static unsafe void Main(string[] args)
    {
        // Native
        Console.WriteLine("The size of bool is {0}.", sizeof(bool));
        Console.WriteLine("The size of short is {0}.", sizeof(short));
        Console.WriteLine("The size of int is {0}.", sizeof(int));
        Console.WriteLine("The size of long is {0}.", sizeof(long));

        // Custom
        Console.WriteLine("The size of Bool1 is {0}.", sizeof(Bool1));
        Console.WriteLine("The size of Bool2 is {0}.", sizeof(Bool2));
        Console.WriteLine("The size of Bool1Int1Bool1 is {0}.", sizeof(Bool1Int1Bool1));
        Console.WriteLine("The size of Bool2Int1 is {0}.", sizeof(Bool2Int1));
        Console.WriteLine("The size of Bool1Long1 is {0}.", sizeof(Bool1Long1));
        Console.WriteLine("The size of Bool1DateTime1 is {0}.", sizeof(Bool1DateTime1));

        Console.Read();
    }
}

public struct Bool1
{
    private bool b1;
}

public struct Bool2
{
    private bool b1;
    private bool b2;
}

public struct Bool1Int1Bool1
{
    private bool b1;
    private int i1;
    private bool b2;
}

public struct Bool2Int1
{
    private bool b1;
    private bool b2;
    private int i1;
}

public struct Bool1Long1
{
    private bool b1;
    private long l1;
}

public struct Bool1DateTime1
{
    private bool b1;
    private DateTime dt1;
}

提供以下输出:

sizeof result

声明字段的顺序似乎在结构的大小中起作用

我原以为Bool1Int1Bool1会返回 6 (1 + 4 + 1)的大小,但它会改为 12 (我猜4 + 4 + 4 ??)!所以似乎编译器通过打包每个4字节来对齐成员。

如果我使用32位或64位系统,它会改变什么吗?

第二个问题,对于long类型的测试,此次bool 打包8字节。 谁能解释一下?

2 个答案:

答案 0 :(得分:2)

这是因为编译器对齐结构的成员变量以允许CPU快速读取和写入它们的值。

在这里,正如您所观察到的,它在每次布尔之后增加了3个虚拟字节。

答案 1 :(得分:2)

这是因为编译器会对成员进行对齐,以便优化其访问速度,而不是内存占用。

您可以添加

[StructLayout(LayoutKind.Sequential, Pack=1)]

在结构定义之前,它应该在1个字节的空格中对齐。