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
Ö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 sadeceUnmanagedType
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.
1.25 m * geçirmeden C, boyutu operatör...
Teşhis Bellek Sızıntıları - bellek boy...
Java temel tür boolean boyutu...
Nasıl bayt kısaltma kullanarak okunabi...
Bellekte bir bayt - Java boyutu...