Bool tipi dil çalışma zamanları arasında birçok uyumsuz seçenek ile damalı bir geçmişi vardır. Bu, C dilini icat eden Dennis Ritchie tarafından yapılan tarihi bir tasarım seçimi ile başladı. Bir bool tipi yoktu , alternatif, 0 değerinin yanlış olduğu ve başka herhangi bir değerin doğru olduğu düşünülen int idi .
Bu seçim, pinvoke kullanmanın birincil nedeni olan Winapi'de, BOOL
C derleyicisinin int anahtar sözcüğü için bir diğer ad olan bir typedef'e sahipti . Açık bir [MarshalAs] özniteliği uygulamazsanız, bir C # bool bir BOOL'a dönüştürülür, böylece 4 bayt uzunluğunda bir alan oluşturulur.
Ne yaparsanız yapın, yapı bildiriminizin birlikte çalıştığınız dilde yapılan çalışma zamanı seçimiyle eşleşmesi gerekir. Belirtildiği gibi, winapi için BOOL ancak çoğu C ++ uygulaması bayt seçti , çoğu COM Otomasyonu birlikte çalışması kısa olan VARIANT_BOOL'u kullanıyor .
C # ' ın gerçek boyutu bool
bir bayttır. CLR'nin güçlü bir tasarım hedefi, bulamamanızdır. Düzen, işlemciye çok fazla bağlı olan bir uygulama ayrıntısıdır. İşlemciler değişken türleri ve hizalama konusunda çok seçici, yanlış seçimler performansı önemli ölçüde etkileyebilir ve çalışma zamanı hatalarına neden olabilir. Düzeni keşfedilemez hale getirerek, .NET, gerçek çalışma zamanı uygulamasına bağlı olmayan evrensel bir tür sistemi sağlayabilir.
Başka bir deyişle, düzeni düzenlemek için her zaman çalışma zamanında bir yapıyı marshal etmeniz gerekir. Bu sırada dahili mizanpadan birlikte çalışma mizanpajına dönüşüm yapılır. Düzen aynısa çok hızlı olabilir, alanların yeniden düzenlenmesi gerektiğinde yavaş olabilir, çünkü her zaman yapının bir kopyasının oluşturulmasını gerektirir. Bunun için teknik terim blittable , blittable bir yapıyı yerel koda geçirmek hızlıdır çünkü pinvoke marshaller basitçe bir işaretçi geçebilir.
Performans aynı zamanda bir boolün tek bir bit olmamasının temel nedenidir . Biraz doğrudan adreslenebilen birkaç işlemci vardır, en küçük birim bir bayttır. Bir ekstra talimat ücretsiz gelmez byte, bit dışarı balık gereklidir. Ve asla atomik değildir.
C # derleyicisi, aksi takdirde 1 baytlık kullanım gerektiğini bildirmekten çekinmiyor sizeof(bool)
. Bu, bir alanın çalışma zamanında kaç bayt aldığı için fantastik bir öngörücü değil, CLR'nin de .NET bellek modelini uygulaması gerekiyor ve basit değişken güncellemelerin atomik olduğunu vaat ediyor . Bu, değişkenlerin bellekte düzgün bir şekilde hizalanmasını gerektirir, böylece işlemci tek bir bellek veri yolu döngüsüyle güncelleyebilir. Oldukça sık, bir bool aslında bu nedenle bellekte 4 veya 8 bayt gerektirir. Bir sonraki elemanın düzgün bir şekilde hizalandığından emin olmak için eklenen ekstra dolgu .
CLR aslında yerleşimin keşfedilemez olmasından yararlanır, bir sınıfın düzenini optimize edebilir ve alanları yeniden düzenleyerek dolguların en aza indirilmesini sağlayabilir. Yani, diyelim ki, bool + int + bool üyesi olan bir sınıfınız varsa, 1 + (3) + 4 + 1 + (3) bayt bellek alacaktır, (3) dolgu, toplam 12 bayt. % 50 atık. Otomatik düzen 1 + 1 + (2) + 4 = 8 bayta yeniden düzenlenir. Yalnızca bir sınıfın otomatik düzeni vardır, yapıların varsayılan olarak sıralı düzeni vardır.
Daha kasvetli bir şekilde, bir bool , AVX komut setini destekleyen modern bir C ++ derleyicisiyle derlenen bir C ++ programında 32 bayta kadar gerektirebilir. 32 baytlık bir hizalama gereksinimi getiren bool değişkeni 31 bayt dolgu ile sonuçlanabilir. Ayrıca, bir .NET titreşiminin SIMD talimatları yayınlamamasının temel nedeni, açıkça sarılmadıkça, hizalama garantisini alamaz.