Newsgroup: it.comp.lang.visual-basic
Titolo: [.NET] Tipo Boolean.

Ciao a tutti.
E' da quando studio che mi pongo un quesito, seppur banale.
In VB, il tipo in oggetto, occupa 4 byte. Se corrisponde unicamente a "0" o a "-1", *dovrebbe* occupare il minimo consentito, cioè 1 byte, come appunto nel tipo SByte.
Se vado a confrontare il contenuto, potrei usare quest'ultimo tipo e festa finita. No?
Addirittura in ogni manuale è consigliato di usarli con parsimonia, proprio a causa del loro "peso".
Allora mi domando a cosa serva. Solamente a poter scrivere "true/false"?
Grazie :-)


 
Capito poco (niente).
Occhio per� a parlare di 0 e -1 in .net.
Vedi qui:
http://msdn.microsoft.com/it-it/library/ae382yt8(v=vs.80).aspx
 
paragrafo che tratta dei valori tipo boolean e conversione in numeri.
 
 
 
 
--
Mauro Gamberini
Microsoft� MVP (Excel)
http://www.maurogsc.eu
 
 

 paragrafo che tratta dei valori tipo boolean e conversione in numeri.
Conosco il valore che viene dato a true e false, cioè rispettivamente -1 e 0: prendevo spunto proprio da questo. Se una variabile contiene un numero intero come i sopra citati, dovrebbe occupare 1 byte, utilizzando una var SByte.

> In VB, il tipo in oggetto
Mi è venuto in mente che citando "oggetti" in un forum di informatica si può essere tratti in inganno!
Riformulo: In VB, il tipo riportato nel titolo del thread (Boolean)...."
:-D


eh eh eh Magari fosse così!
Allora basterebbe un bit!!!!
 
In genere Boolean è un tipo che deriva da un integer....
0 è falso....tutti gli altri valori...vero
 
Nulla toglie di usare un byte...ed usare il primo bit 2^0 = 1  vero 
vuoto falso
o il terzo byte 2^2=4 vero...
 
ma se fai così è perchè usi il byte come maschera di bit...ade esempio
01001101 ti mostra quale apparato è acceso e quale no!
Tutti i linguaggi possono usare la maschera di bit (credo che nei 
meandri di Net ci siano pure namespace specifici) e comunque vada basta 
usare un operatore OR e AND per leggere e settare!!!
 
 
MA
come mai si "butta" via tanto spazio????
Albano e Romina cantavano....felicità...felicità
gli ingegneri del sw cantavano...velocità...velocità
 
 
Infatti il tipo di dati più veloce non è il byte (quasi mai) ma quello 
che corrisponde alla dimensione dei registri interni movimentati dalle 
istruzioni in codice macchina delle nostre CPU
 
Mi viene in mente il classico esempio di VB6....è più veloce dichiarare 
variabili integer o long???
La risposta era long!
perchè long erano 32 bit e il codice compilato usavo pochi cicli 
macchina "riempiendo giusto giusto" i registri della cpu...ed avendo la 
cpu operazioni native a 32 bit
 
L'integer a 16 bit invece costringeva la cpu a fare "più calcoli" per 
allineare il numero che era più piccolo dei registri ed altre menate che 
non ricordo!
 
PERO'
NET fa storia a se...anche l'integer...anche il byte...è stringi stringi 
un oggetto....lo vedi da quante cose si porta dietro...ti sembra analogo 
ad un integer di C?
 
In genere te ne devi fregare in net...non hai MAI accesso alla memoria 
fisica...lascia stare al compilatore decidere che cavolo di istruzioni 
usare...ed usa Boolean come previsto dal linguaggio....od usa una 
maschera di bit...dipende da quello che vuoi fare!!!
 
Saluti!
 

 in codice macchina delle nostre CPU
 
appunto, quindi ï¿œ piï¿œ una sega mentale star li a scegliere in base allo 
spazio occupato.
 
.m
 
-- 
blog @ //
milestone.topics.it
 
 
 

Ciao Vodka,
vedo che hai capito perfettamente a cosa mi riferivo.
Posto una nota che mi salvai a suo tempo:
"Gran parte di questi tipi si trova nell'mscorlib.dll e in system.dll anche se la Base Class Library (BCL) si distribuisce più o meno su una trentina di assembly.
 
Apriamo questa libreria, andiamo dentro System. Qui possiamo trovare il nostro Boolean.
Come costi di archiviazione, una variabile booleana richiede 32 bit cioè 32 diviso 8 sono 4 byte.
Questo, tutto sommato, è un valore piuttosto elevato per una singola variabile ma se questo costo è ridotto a una sola variabile allora è un costo tutto sommato accettabile.
SE PERÒ DOVESSIMO RIPETERE QUESTI QUATTRO BYTE DI VARIABILI BOOLEAN, QUINDI FONDAMENTALMENTE USASSIMO UN'ARRAY DI BOOLEAN, ALLORA LE COSE SI POTREBBERO COMPLICARSI UN POCO.
Quindi c'è da stare attenti da questo punto di vista."
Ovviamente la questione verte non su quanta RAM occupi ,ma bensì sulla complessità dei potenziali calcoli.
 
Ad ogni modo mi fido e seguo il tuo prezioso consiglio.
Grazie infinite! ;-)


MAH!.....per me sono seghe mentali non da poco....concordo con Mauro!
Primo
non è C ne tantomeno Assembler....sai una cippa flag=true come viene 
sviluppato dal compilatore!
Secondo
la cpu è virtuale ....MSIL...e solo alla fine ...all'esecuzione...viene 
legato davvero all'effettivo codice macchina del pc
Terzo
Usi come si capisce anche dal primo punto un linguaggio ad alto livello 
che "astrae" dalla cpu. Nel caso di net ASTRAE parecchio arrivando ad un 
codice interpretabile da qualsiasi Intel con windows....se fossi in Java 
ASTRAERESTI ancora di più potedo programare un codice che girererebbe 
anche sotto linux o sparc o mac.
 
 
La tua obiezione è:
butta via una word per memorizzare un bit!
Si lo fa per ragioni di velocità...per ragioni di coerenza...
 
come detto....non ti piace? Il bello di Net è che lo puoi 
tranquillamente bypassare....BOOLEAN è un type finto.....lo puoi emulare 
anche con una stringa...A=vero tutto il resto falso...persino stringa 
vuota...
MA se l'obiezione è ...la mia mega matrice contiene 300.000 boolean! 
BEEEP ....qualcosa nel design non funziona!
Hai 300.000 campi in una tabella???....una dataTable ti fa schifo è???
 
Vieppiù
 
Garbage Collection
semplicemente "viva" in Net! Fai conto di avere uno spiritello nel pc!
Fa come gli pare....
Scrivi
pippo=nothing o pippo.dispose....ti rilascia la memoria quando gli pare 
a lui!Se in quel momento GC decide che non c'è tempo per farlo o le 
prestazioni per distruggere memoria "non convengono" (in base ai suoi 
algoritmi)...NON LO FA!
 
Puoi forzarlo a farlo!....ma in genere è altamente sconsigliato...rischi 
davvero TU di peggiorare le prestazioni della applicazione!
 
 
 
SINTESI:
-non lavori con un linguaggio a basso livello!
-non hai controllo della memoria effettivamente allocata (yupppi! per 
fortuna!)
-non te ne deve fregare della ram...ci pensa compilatore e gc a gestirla 
ed ottimizzarla...potrebbe anche non rispecchiare la realtà virtuale di 
quello che hai scritto.
-le tue menate sono vere solo in un caso: nello schema di una tabella di 
un DATABASE REALE...lì è vero...il record deve essere il più compatto 
possibile....ma non è l'oggetto del post!
 
QUINDI
campa tranquillo ed usa i boolean che vuoi...o anche no!
 
 
MI permetto da ultimo di scagliare un missile
 
 
BOOLEAN che roba è secondo te in VB.net????
.......non andare a guardare l'help è!!!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
....è una struttura!.....quindi....
dim a as int32
dim b as boolean
 
 
a=0
b=false
 
 
a=11
b=true
 
qual'è più veloce????
 
 
 
 
 
 
 
 
 
 
 
 
?????
 
 
 
 


http://msdn.microsoft.com/it-it/library/a28wyd50.aspx
 
ma anche
http://msdn.microsoft.com/it-it/library/system.int32.aspx
 
 
 
o perbacco e che vuol dire????
http://msdn.microsoft.com/it-it/library/2hkbth2a.aspx
 
nello specifico
Cito
"...
Le strutture si avvalgono dell'allocazione dello stack, le classi 
dell'allocazione dell'heap.
...."
 
E ALLORA "2"+"2"="22"
partendo da qui
http://msdn.microsoft.com/it-it/library/47zceaw7.aspx
 
 
si arriva alla conclusione
http://msdn.microsoft.com/it-it/library/06bkb8w2(v=vs.110).aspx
 
 
che recita....cito...
"....
Il tipo di dati Integer consente di ottenere prestazioni ottimali su 
processori a 32 bit. Gli altri tipi integrali vengono caricati e 
memorizzati più lentamente.
 
Il valore predefinito di Integer è 0.
..."
 
 
che è quanto detto fino ad ora!!!