Permalänk
Medlem

stacken & heapen c#

Vad är heapen för något?
Vad hamnar på Heapen?

Vad är stacken för något?
Vad hamnar på stacken?

så här har jag svarat om stacken:
Stacken är en del av minnet i datorn som knyts till programmet. På stacken lagras data som är av enkla
typer, t.ex. int, double, char och bool, s.k. värdetyper (value types).

Kan någon förklara detta lite för mig?

Permalänk
Medlem

Vill du ha ditt svar förklarat för dig..?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Jag formulerade det lite fel...ops

Det jag skrivit om stacken, är det rätt? och vad har stacken med heapen att göra? har googlat hela dagen o hittar mest info på engelska som tyvärr inte är min starka sida. Så om någon kan förklara så vore jag tacksam. eller länka till en sida som förklarar det på svenska

Permalänk
Hedersmedlem

Jag tror frågan egentligen är tvådelad. Stack och Heap är generella begrepp som du bör kunna Googla på för att få förklaringar. När du väl fattar vad de är så behöver du bara ta reda på hur C# använder dem.

Det du har skrivit om stacken verkar iofs rätt, men det finns ganska mycket mer att säga om stacken rent generellt.

Det finns för och nackdelar med både stack och heap och det är vettigt att veta vilket som påverkar vad så att du kan göra en bra design av ditt program från början, men det finns inga genvägar till att lära sig. Du kan ju tex börja med Wikipedia.

Visa signatur

Använd gilla för att markera nyttiga inlägg!

Permalänk
Hedersmedlem
Skrivet av izeman82:

Jag formulerade det lite fel...ops

Det jag skrivit om stacken, är det rätt? och vad har stacken med heapen att göra? har googlat hela dagen o hittar mest info på engelska som tyvärr inte är min starka sida. Så om någon kan förklara så vore jag tacksam. eller länka till en sida som förklarar det på svenska

Jag hoppas du inte tänker arbeta med programmering, för i så fall är det nog hög tid att lära sig läsa tekniska texter på engelska.

Visa signatur

Använd gilla för att markera nyttiga inlägg!

Permalänk
Medlem

Nä jag ska inte jobba med programmering.

Då är det egentligen bara detta som jag vill veta: Vad är heapen för något?
Vad hamnar på Heapen?

Permalänk
Medlem

På heapen bildas sådant som skapas med bl.a new och tas bort med hjälp av garbage collectorn som finns i CLR. Blev det tydligare?

Permalänk
Medlem
Permalänk
Hedersmedlem

I tillägg så kan det vara bra att skilja på datorns minne (de adresserbara RAM-stickorna) och virtuella minnet för en process (process = program som körs).
En process minne (adressrymd) är där heap och stack (och lite annat) existerar.
Förenklat sett så ser inte någon annan process detta minne, alla har sin egen adressrymd. Operativsystemet har en hantering (VMM, Virtual Memory Manager) av detta så det vet att den fysiska minnesadressen si och så är var en bit av virtuella minnet för den och den processen lagras. Också detta som gör att en växlingsfil kan användas utan att programmen behöver hantera det. Obs. en växlingsfil (en fil/utrymme på hårddisken som operativsystemet skyfflar över data i när det inte använts på länge eller RAM börjar bli fullt) är inte detsamma som virtuellt minne.

Heap och stack är inte begrepp bundna till C#, men gällande heap:en är det specifikt för C# (och andra språk, men inte alla) att det finns en skräphanterare (Garbage collector) som tar bort oanvända saker därifrån.

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG

Permalänk
Medlem

Detta skrev jag om Heapen:
Detta minnesutrymme används av mjukvara som kan hämta och lämna tillbaka ”minnesytor” via anrop till exempelvis ett operativsystem som håller reda på vilka delar som är lediga.
Heapen är den del av minnet där stora stycken av data placeras. Till skillnad mot enstaka värden av enkla typer (värdetyper) som ju lagras på stacken. Minne allokeras till data och avallokeras då det inte längre behövs.
Ditt program kan allokera minne till data på heapen, men programmet kan inte avallokera det, det görs på automatik av ”skräpinsamlaren” (garbage collector, GC)när den ”känner” av att ditt program inte längre använder data på heapen,

Garbage collector (GC) är del av Common Language Runtime (CLR).

Och detta om stacken:

Stacken är en del av minnet i datorn som knyts till programmet. På stacken lagras data som är av enkla typer, t.ex. int, double, char och bool, s.k. värdetyper (value types).

Och nu håller jag på med ett nytt uppdrag i kursen och följande fråga kommer:
Denna uppgift handlar om Stacken och Heapen. Förklara:
1.vad de är för något.
2.hur de sammarbetar.
3.hur man lägger till och tar bort värden på dem.

1 Det har jag ju svar på ovan som jag skrivit.
2 Hur ska man förklara det??????
3 saker läggs dit när man kör de olika värdetyperna, och skräphanteraren tar bort det.

Permalänk
Medlem

"Heapen är den del av minnet där stora stycken av data placeras" tycker jag låter väldigt otydligt. vad är stora stycken? Du kan skapa en Class med ett värde i vilket kommer allokera plats på heapen. Storleken har inget med saken att göra direkt. Skillnaden är att värde typer (primitiva datatyper) läggs på stacken och referens typer läggs på heapen.

"programmet kan inte avallokera det" detta är inte helt sant, du kan kalla explicit på GCn och be den rensa upp specifika objekt.

2. Kräver att du läser på mer skulle jag vilja säga, relationen mellan de två kräver lite insikt. För att ge en liten *hint* värden som lagras på heapen lagras delvis på stacken,

3. Tror du bör särskilja på hur det läggs till / tas bort beroende på om det är value type / reference type

Permalänk
Medlem

Stacken

Stacken är en minnesplats som ligger på ett vanligt Ram-minne. Det är en snabb minneshanterare som kan hålla reda på en begränsad mängd information. Deklerationer av olika typer får plats på stacken utan problem. Stora objekt däremot läggs istället på heapen.

Stacken lägger till och tar bort allt som läggs in den överst. Man kan tänka sig en hög med kort från en kortlek där man bara kan lägga kort överst, alternativt ta bort det översta. Det innebär att man bara kan ta bort variablen tal på bilden nedan. När tal sen är borta kan man sen ta bort Person-objektet. Man kan även bara lägga till värden högst upp.

Push och pop:
•Metoden för att lägga till på stacken heter push()
•Metoden för att ta bort från stacken heter pop()

Heapen
•Alla referenstyper/referensobjekt hamnar på Heapen.
•Referenstyper använder i regel nyckelordet new när man tilldelar deklerationen ett värde.
•Lägger man inte till ett värde så kommer referensen att ha värdet null.
•Deklerationen av objektet läggs på stacken. Sen pekar deklerationen på själva objektet på heapen. Se den röda pilen ovanför.

Något som är viktigt att poängtera här är att om man tar en kopia på ett objekt som pekar på samma värde på heapen så ändras bådas värde om man gör en förändring i det ena. Det är för att de pekar på samma objekt på heapen. Titta på exemplet nedan.

Den här informationen står i min studieguide, tycker det är riktigt svårt att formulera om det!

Permalänk
Medlem

Det verkar som att du inte har förstått så bra, du har missat det allra viktigaste. Hur bra är du på engelska egentligen? Om du klarar av att läsa på engelska så finns det 100 sidor som förklarar det bättre än de resurser du verkar ha.

Permalänk
Medlem

Det är ju det som är problemet att allt bara står på Engelska! Läste Engelska i kolan för x antal år sedan o blev godkänd, sen dess har engelskan legat på hyllan.
Och att använda google translate ger ju inte den bästa översättningen!

Permalänk
Medlem
Skrivet av izeman82:

Det är ju det som är problemet att allt bara står på Engelska! Läste Engelska i kolan för x antal år sedan o blev godkänd, sen dess har engelskan legat på hyllan.
Och att använda google translate ger ju inte den bästa översättningen!

Ok, jag skrev om hur det fungerar på svenska. Men ett extremt hett tips: Lär dig engelska! Det är extremt viktigt, inte bara för programmering. Det är typ det viktigaste du kan göra, tätt efter att äta mat och andas.

En stack (stack = stapel på svenska) är en datastruktur där man bara kan lägga
till nya element överst, och ta bort element överst, d.v.s. i omvänd ordning som
man la till dem (som på en stapel tallrikar). Stacken, i bestämd form, är en
sådan datastruktur som programmet använder när det körs för att lagra data som
det (programmet) behöver.

På stacken läggs lokala variabler och argument. Säg att du har följande kod.
(Koden är ganska meningslös, men jag hade dålig fantasi.)

int add(int x, int y) { int result = x + y; return result; } void print_times(int x, int times) { for (int i = 0; i < times; i++) { Console.WriteLine(x); } } void add_and_print_3_times(int a, int b) { int sum = add(a, b); print_times(sum, 3); } static int Main(string[] args) { add_and_print_3_times(3, 17); return 0; }

Du är i början av main. Då ser stacken ut som följer:

-----------------------------
args: 0x239797
-----------------------------

D.v.s. det finns bara en sak på stacken: variablen args som är en referens
till en string[].

När vi anropar add_and_print_3_times(3, 17) så kommer det minne som den
metoden behöver att allokeras på stacken, så i början av
add_and_print_3_times(3, 17) så ser stacken ut:

-----------------------------
a: 3
b: 17
sum: (inget)
-----------------------------
args: 0x239797
-----------------------------

Strecken här (---) använder jag för att man ska se var metoders "stack frames"
börjar och slutar. Det första add_and_print_3_times gör är att anropa
add(3, 17). Då ser stacken ut:

-----------------------------
x: 3
y: 17
result: (inget)
-----------------------------
a: 3
b: 17
sum: (inget)
-----------------------------
args: 0x239797
-----------------------------

Nästa sak programmet gör är att köra raden `int result = x + y;`. Programmet
lagrar då 20 i resultat-platsen på stacken:

-----------------------------
x: 3
y: 17
result: 20
-----------------------------
a: 3
b: 17
sum: (inget)
-----------------------------
args: 0x239797
-----------------------------

När add-metoden returnerar så tas det minnet bort från stacken (det ligger
överst, eller hur?). Säg att tilldelningen i raden `int sum = add(a, b);`
också sker, då kommer stacken att se ut:

-----------------------------
a: 3
b: 17
sum: 20
-----------------------------
args: 0x239797
-----------------------------

Nu ska print_times(20, 3) anropas. print_times har också lokala variabler och
argument, så stacken kommer att se ut:

-----------------------------
x: 20
times: 3
i: (inget)
-----------------------------
a: 3
b: 17
sum: 20
-----------------------------
args: 0x239797
-----------------------------

Medan loopen i print_times körs så kommer givetvis `i` att uppdateras. När
print_times är klar så tas det minnet bort igen, och vi får kvar:

-----------------------------
a: 3
b: 17
sum: 20
-----------------------------
args: 0x239797
-----------------------------

Nu är add_and_print_3_times också klar, och vi får kvar:

-----------------------------
args: 0x239797
-----------------------------

Sammanfattningvis: På stacken läggs lokala variabler och argument (och kanske
lite mer grejer, men det är inte jätteviktigt). Det är viktigt att inse att
när man anropar en metod så kommer alltid metodens stack frame (dess variabler
och argument) att hamna överst på stacken. Och när man är klar med en metod så
kommer alltid dess stack frame att ligga överst, så vi kan ta bort den utan
problem.

Så hur används heapen?

Jo, args i Main är ju en string[]. string[]:er läggs på heapen, och det som
sparas på stacken, (här: `args: 0x239797`) är en adress till den. Så på
heapen, på plats 0x239797 så ligger en string[]. Så är det med alla lokala
variabler som är av en referenstyp, d.v.s. inte en primitiv (int, double,
bool, o.s.v.). Om en stackframe som refererar till ett objekt tas bort (för
att vi är klara med den metoden) så förlorar vi referensen till objektet om vi
inte hade sparat undan den nånstans. Om vi nu inte har kvar några referenser
till objektet så kommer objektet så småningom att städas undan av garbage
collectorn.

Notera att 0x239797 är ett vanligt nummer, men man brukar skriva adresser i hexadecimalform (0x betyder hexadecimalform).

Permalänk
Medlem
Skrivet av tufflax:

Ok, jag skrev om hur det fungerar på svenska. Men ett extremt hett tips: Lär dig engelska! Det är extremt viktigt, inte bara för programmering. Det är typ det viktigaste du kan göra, tätt efter att äta mat och andas.

En stack (stack = stapel på svenska) är en datastruktur där man bara kan lägga
till nya element överst, och ta bort element överst, d.v.s. i omvänd ordning som
man la till dem (som på en stapel tallrikar). Stacken, i bestämd form, är en
sådan datastruktur som programmet använder när det körs för att lagra data som
det (programmet) behöver.

På stacken läggs lokala variabler och argument. Säg att du har följande kod.
(Koden är ganska meningslös, men jag hade dålig fantasi.)

int add(int x, int y) { int result = x + y; return result; } void print_times(int x, int times) { for (int i = 0; i < times; i++) { Console.WriteLine(x); } } void add_and_print_3_times(int a, int b) { int sum = add(a, b); print_times(sum, 3); } static int Main(string[] args) { add_and_print_3_times(3, 17); return 0; }

Du är i början av main. Då ser stacken ut som följer:

-----------------------------
args: 0x239797
-----------------------------

D.v.s. det finns bara en sak på stacken: variablen args som är en referens
till en string[].

När vi anropar add_and_print_3_times(3, 17) så kommer det minne som den
metoden behöver att allokeras på stacken, så i början av
add_and_print_3_times(3, 17) så ser stacken ut:

-----------------------------
a: 3
b: 17
sum: (inget)
-----------------------------
args: 0x239797
-----------------------------

Strecken här (---) använder jag för att man ska se var metoders "stack frames"
börjar och slutar. Det första add_and_print_3_times gör är att anropa
add(3, 17). Då ser stacken ut:

-----------------------------
x: 3
y: 17
result: (inget)
-----------------------------
a: 3
b: 17
sum: (inget)
-----------------------------
args: 0x239797
-----------------------------

Nästa sak programmet gör är att köra raden `int result = x + y;`. Programmet
lagrar då 20 i resultat-platsen på stacken:

-----------------------------
x: 3
y: 17
result: 20
-----------------------------
a: 3
b: 17
sum: (inget)
-----------------------------
args: 0x239797
-----------------------------

När add-metoden returnerar så tas det minnet bort från stacken (det ligger
överst, eller hur?). Säg att tilldelningen i raden `int sum = add(a, b);`
också sker, då kommer stacken att se ut:

-----------------------------
a: 3
b: 17
sum: 20
-----------------------------
args: 0x239797
-----------------------------

Nu ska print_times(20, 3) anropas. print_times har också lokala variabler och
argument, så stacken kommer att se ut:

-----------------------------
x: 20
times: 3
i: (inget)
-----------------------------
a: 3
b: 17
sum: 20
-----------------------------
args: 0x239797
-----------------------------

Medan loopen i print_times körs så kommer givetvis `i` att uppdateras. När
print_times är klar så tas det minnet bort igen, och vi får kvar:

-----------------------------
a: 3
b: 17
sum: 20
-----------------------------
args: 0x239797
-----------------------------

Nu är add_and_print_3_times också klar, och vi får kvar:

-----------------------------
args: 0x239797
-----------------------------

Sammanfattningvis: På stacken läggs lokala variabler och argument (och kanske
lite mer grejer, men det är inte jätteviktigt). Det är viktigt att inse att
när man anropar en metod så kommer alltid metodens stack frame (dess variabler
och argument) att hamna överst på stacken. Och när man är klar med en metod så
kommer alltid dess stack frame att ligga överst, så vi kan ta bort den utan
problem.

Så hur används heapen?

Jo, args i Main är ju en string[]. string[]:er läggs på heapen, och det som
sparas på stacken, (här: `args: 0x239797`) är en adress till den. Så på
heapen, på plats 0x239797 så ligger en string[]. Så är det med alla lokala
variabler som är av en referenstyp, d.v.s. inte en primitiv (int, double,
bool, o.s.v.). Om en stackframe som refererar till ett objekt tas bort (för
att vi är klara med den metoden) så förlorar vi referensen till objektet om vi
inte hade sparat undan den nånstans. Om vi nu inte har kvar några referenser
till objektet så kommer objektet så småningom att städas undan av garbage
collectorn.

Notera att 0x239797 är ett vanligt nummer, men man brukar skriva adresser i hexadecimalform (0x betyder hexadecimalform).

JA VAD SKA JAG SÄGA!!?? TACK SOM FAN!!!! Utan denna beskrivning så hade jag aldrig förstått det så grundligt!!!

Permalänk
Medlem
Skrivet av izeman82:

Lol jag gillar att ditt svar om "Stack" är en exakt kopia av vad de skrev om Stacken i denna länk.