SORU
14 ŞUBAT 2015, CUMARTESİ


C boolean boyutu ne#? Gerçekten 4-bayt sürer?

Bayt ve mantıksal dizileri ile iki yapı var:

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack = 4)]
struct struct1
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public byte[] values;
}

[StructLayout(LayoutKind.Sequential, Pack = 4)]
struct struct2
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public bool[] values;
}

Ve aşağıdaki kodu:

class main
{
    public static void Main()
    {
        Console.WriteLine("sizeof array of bytes: " Marshal.SizeOf(typeof(struct1)));
        Console.WriteLine("sizeof array of bools: "   Marshal.SizeOf(typeof(struct2)));
        Console.ReadKey();
    }
}

Bana şu çıktıyı verir:

sizeof array of bytes: 3
sizeof array of bools: 12

boolean depolama 4 bayt alır gibi görünüyor. İdeal boolean bir tek bit (false true, 0 1, vb.) sürer.

Burada neler oluyor? boolean yazın gerçekten çok verimsiz.

CEVAP
14 ŞUBAT 2015, CUMARTESİ


Öncelikle, busadecebirlikte çalışabilirlik için boyutu. Dizinin yönetilen kod boyutunu temsil etmiyor. 1 en azından benim makinede bool - bayt başına. Bu kod ile kendinize test edebilirsiniz:

using System;
class Program 
{ 
    static void Main(string[] args) 
    { 
        int size = 10000000;
        object array = null;
        long before = GC.GetTotalMemory(true); 
        array = new bool[size];
        long after = GC.GetTotalMemory(true); 

        double diff = after - before; 

        Console.WriteLine("Per value: "   diff / size);

        // Stop the GC from messing up our measurements 
        GC.KeepAlive(array); 
    } 
}

Şimdi, değer diziler sıralanırken olan, documentation diyor ki:

Ne zaman MarshalAsAttribute.Değer özelliği, dizideki öğe sayısını belirtmek için ayarlanmış olması gerekir ByValArray, ayarlanır. ArraySubType alan isteğe bağlı olarak dize türleri arasında ayırt etmek için gerekli dizi elemanları UnmanagedType içerebilir. Olan elemanları bir yapı alanları olarak görünen bir dizi sadece UnmanagedType bunu kullanabilirsiniz.

Belgelerine sahip ArraySubType ve bakalım:

UnmanagedType dizi elemanlarının türünü belirtmek için numaralandırma değeri bu parametre ayarlayabilirsiniz. Eğer bir tür belirtilirse, varsayılan yönetilmeyen tür yönetilen dizi öğesi türü için ilgili kullanılır.

Şimdi UnmanagedType, orada bakarak:

Bool
4 baytlık bir Boolean değeri (true=! 0, false = 0). Bu Win32 BOOL türü.

Bu yüzden varsayılan bool ve 4 bayt çünkü karşılık gelen win 32 BOOL türü yani çalışma ile kod bekliyor BOOL dizi, tam olarak ne istediğiniz.

Şimdi belgelenmiş olan I1 ArraySubType yerine belirtebilirsiniz:

Bir 1 bayt işaretli tamsayı. Bu üye 1-bayt, C-bool tarzı içine bir Boolean değeri (=1, false = 0) dönüştürmek için kullanabilirsiniz.

Kodu eğer bekler 1 bayt başına değeri, sadece kullanımı ile birlikte çalışma sensin.

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.I1)]
public bool[] values;

Kodu 1 bayt başına değer, beklendiği gibi kaplıyor gibi gösterir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kylelandry

    kylelandry

    9 AĞUSTOS 2007
  • National Geographic

    National Geo

    7 Mayıs 2006
  • Xbox

    Xbox

    1 Kasım 2005