|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[C#]primi dubbi
Seguendo i vostri consigli,ho cominciato a studiare un pò il C# da alcune guide ed ora mi si pone il primo problema dovuto all'ignoranza di certe cose ovvero:
Studiando i tipi struct e le classi,ho ben capito alcune delle differenze che esistono fra di loro ovvero: 1) Un tipo struct non supporta l'ereditarietà mentre un tipo class si. 2) Un tipo struct è un tipo valore e non un tipo riferimento. E il punto due mi manda in tilt. Documentandomi,credo di aver capito che i tipi valore vengono memorizzati in un'area di memoria chiamata stack,che a sua volta è una struttura che utilizza il concetto di "pila" per memorizzare i dati con il metodo LIFO,che,sempre se non ho capito male,significa che l'ultimo dato memorizzato sarà sempre il primo ad essere estratto. Invece un tipo "riferimento" come una classe,utilizza un'area di memoria detta heap. Adesso,se volessi capire in termini fisici queste due diverse aree di memoria(stack e heap),mi consigliate di studiarmele: - ognuna per conto proprio - avere un concetto generale - che importanza ha conoscerle bene insomma,qualsiasi cosa che possa chiarirmi questi primi dubbi Thx. RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#2 | |||
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
Quote:
Quote:
Le struct sono tipi di dato passati per valore. Come gli int, byte, double... Quando chiami una funzione il dato contenuto viene preso e copiato in una nuova variabile all'interno dello stack. Quindi anche se la funzione chiamata modifica il valore, la variabile originale all'interno della chiamante non ne risente. Le classi invece vengono create dinamicamente nel heap. Quando chiami una funzione e gli passi il nome di un oggetto che hai appena creato non fai altro che passargli un riferimento alla memoria in cui è stato creato. In questo caso se la funzione chiamata modifica qualcosa la modifica si propaga anche alla chiamante. ciao |
|||
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Ciò che non mi è chairo è cosa sia lo stack e cosa sia l'heap :/ Stasera comunque non può essermi chiaro nulla dato che mi sono scolato una marea di alcool!!!
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
Lo stack viene usato per parcheggiare temporaneamente i parametri da passare alle funzioni e altre informazioni. In genere sugli x86 e limitato a 64k ma può variare tranquillamente. Il mio professore mi diceva sempre di pensare ad una pila di tazzine di caffè appese al soffitto. Io non ho mai capito che cosa intendesse con quel esempio, vedi te se capisci che cosa voleva dire L'heap è simile. Qui viene allocata la memoria dal sistema operativo quando il tuo programma richiede un po' di memoria dinamica. L'heap non è una pila, e tra una zona di memoria e l'altra ci possono essere anche dei buchi. ciao |
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jul 2004
Città: Napoli
Messaggi: 2029
|
Quote:
cmq quoto anche nel fatto che ci sono dei buchi tra queste due aree di memoria,ì; di solito esiste anche un'area dei dati statici e globali. la politica di gestione dello heap è decisa dall'O.S |
|
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Aug 2005
Città: Falconara Marittima (AN)
Messaggi: 5
|
Io sono completamente ignorante di C# e di memoria ne so relativamente poche, comunque, da buon (ex) algoritmista, provo a farti capire cosa siano stack e heap in senso più ampio, slegato dall'implementazione reale.
Uno stack è un metodo di memorizzazione di base, nel senso che non richiede che si conosca alcunché di ciò che c'è stato inserito. Lo puoi immaginare fisicamente come un array, di dimensioni incognite, in cui le uniche operazioni che puoi fare sono aggiungere e rimuovere l'ultimo elemento. Caffè o non caffè, stack significa pila, e questo è esattamente ciò che è: una torre di dati, non puoi toccarla in mezzo ma puoi solo prendere quello che c'è in cima o metterci qualcos'altro. Detto così sembra solo un modo per limitarsi la libertà piuttosto che usare un array, e in effetti lo è Il C usa uno stack (invisibile) ad esempio per la ricorsione. Nello stack di memoria si salvano le funzioni aperte. Tutte le macchine reali monoprocessore eseguono una sola operazione alla volta, e di conseguenza processano una sola funzione alla volta. Fondamentalmente, senza scendere in particolari che non conosco, aprendo una funzione i dati ad essa relativi (mi vengono in mente i parametri, forse anche qualcos'altro più low-level) vengono pushati sulla cima dello stack di memoria. Se la funzione chiama un'altra funzione, i suoi dati verranno aggiunti anch'essi allo stack, e quando si chiuderà una funzione sarà di certo l'ultima aggiunta (a meno di violare l'incapsulamento con funzioni tipo exit, ma queste sono eccezioni). Così facendo risulta uno stack, che è la struttura più adatta a mantenere questi dati. Uno heap è un albero ordinato. Un albero è un grafo senza cicli appeso per una radice. Un grafo è una serie di nodi e rami A livello teorico nello heap i dati sono inseriti nei nodi, collegati tra loro dai rami in modo che non si formino cicli e che ha la struttura tipica di un albero (una radice, da cui si ripartiscono dei rami, da ogni ramo altri rami, finché non si arriva alle "foglie", ovvero nodi senza figli). Spiegarsi senza fare un lungo e noioso preambolo è impossibile, quindi prendi questa definizione per buona L'ordinamento dello heap consiste nell'avere alla radice il valore minimo di tutti, e ad ogni nodo vale la proprietà che non può avere un valore minore del padre (un professore trentino la definiva con un certo humor la "no Edipo property", nessun figlio deve soffrire di minoranza rispetto al padre Detto così questa cosa apparentemente complicata sembra essere del tutto inutile, in realtà è utilissima in tante situazioni che nemmeno ricordo più da quanto tempo è che non le uso Ora, da tutto ciò a risalire a struct e classi non so cosa ci corra, se non che sono sicuro esista (come peraltro già detto) una parte della memoria chiamata "stack" che funziona appunto come uno stack, e mi pare di aver capito dalle discussioni precedenti che ne esiste pure una chiamata "heap" che dello heap ha le proprietà... Ho scritto un pillolone inutile e poco interessante per i più, spero solo che qualcuno sia arrivato fin qui senza imprecare contro di me |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Anzi,tutt'altro!! Ora,tornando al mio dubbio,credo quindi che grazie alle vostre spiegazioni,mi sia stato fugato. Thx. RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Questa e' la miglior spiegazione che conosco su che cos'e' esattamente un value type: http://blogs.msdn.com/slippman/archi...23/193353.aspx
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#9 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
Ma la cosa che non capisco è perchè devono essere appese al soffitto |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
Dall'alto perché se non sbaglio in x86 i dati vengono aggiunti dal alto per arrivare fino a 0. Quindi se 0 è il pavimento e 65k è il soffitto. ciao |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Non mi suona molto chiaro: potresti spiegarmi cosa intendi per "aggiungere i dati dall'alto" (per x86)?
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
ciao |
|
|
|
|
|
|
#13 | |
|
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
|
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
In realtà non ho mai usato test e jump neppure quando ho scritto codice a 16 bit per x86: troppo oneroso dal punto di vista computazionale.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:06.



















