Why is a boolean 4 bytes in .NET?

前端 未结 6 2230
我在风中等你
我在风中等你 2020-11-29 07:54

Why does a System.Boolean take 4 bytes? It just stores one state, either true or false, which could be stored in less space than 4 bytes.

相关标签:
6条回答
  • 2020-11-29 08:24

    A bool is actually only 1 byte, but alignment may cause 4 bytes to be used on a 32-bit platform, or even 8 bytes on a 64-bit platform. For example, the Nullable<bool> (aka bool?) type uses a full 32 or 64 bits—depending on platform—even though it's comprised of just two bools. EDIT: As pointed out by Jon Skeet, padding for alignment isn't always present. As an example, an array of Nullable<bool>s takes only 2 bytes per object instead of 4 or 8.

    But even 8 bits to represent a bool can be considered wasteful if you have many of them to store. For this reason, if you create a type that has many bools as members, (or uses many Nullable<> types), and users of your class might create many instances of it, you might consider using a BitVector32 instead. The framework itself uses this technique to reduce the memory footprint of many of the Windows Forms controls, for instance.

    0 讨论(0)
  • 2020-11-29 08:24

    I used the following code to create a couple arrays and test them. float?[100000] uses twice as much memory as float[100000]. This is because the bool that accompanies the float in the float? case gets aligned to 32 bits (at least on my machine ;-) )

    long startMem = 0, stopMem = 0;
    DateTime startTime = DateTime.Now;
    private void StartMemoryUsage()
    {
        GC.Collect();
        GC.Collect();
        startMem = GC.GetTotalMemory(true);
        startTime = DateTime.Now;
    }
    private void StopMemoryUsage()
    {
        GC.Collect();
        GC.Collect();
        stopMem = GC.GetTotalMemory(true);
    
        Console.WriteLine("---> {0} sec.  Using {1} KB.", (DateTime.Now - startTime).TotalSeconds, ((stopMem - startMem) / 1000).ToString());
    }
    
    0 讨论(0)
  • 2020-11-29 08:38

    The first result on a Google search for System.Boolean size told me that it's to do with memory alignment. It's faster to push around a four-byte Int32 than it is to work with individual bytes/bits.

    0 讨论(0)
  • 2020-11-29 08:44

    Where'd you get that? System.Boolean takes only 1 byte.

    Just try:

    Console.WriteLine( sizeof( System.Boolean ).ToString() );
    
    0 讨论(0)
  • 2020-11-29 08:47

    Because it's fast.

    A 32-bit processor typically works with 32-bit values. Working with smaller values involves longer instructions, or extra logic.

    0 讨论(0)
  • 2020-11-29 08:47

    I think it's only for performance, 32 bit values are much more efficient to manipulate.

    0 讨论(0)
提交回复
热议问题