static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d...

17
MINNESHANTERING OCH GARBAGE COLLECTORN REFERENCE TYPES, VALUE TYPES, PEKARE, HEAP, STACK MED MERA. FELIX LEPISTÖ, DS13

Transcript of static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d...

Page 1: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

MINNESHANTERING OCH GARBAGE COLLECTORN

REFERENCE TYPES, VALUE TYPES, PEKARE, HEAP, STACK MED MERA.

FELIX LEPISTÖ, DS13

Page 2: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

FÖRORD

• ALLA SPRÅK HAR SMÅ SKILLNADER, SÅ EXEMPLEN KANSKE INTE STÄMMER HELT PÅ ”DITT” SPRÅK.

• EXEMPLEN ÄR I C#.

• JAG ÄR STUDENT, INTE LÄRARE.

• JAG KAN INTE JAVA & PYTHON SÄRSKILT BRA.

Page 3: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

MINNESHANTERING I C++.

• ANVÄNDER PEKARE. (*)

• PEKARE HÅLLER KOLL PÅ DATA.

• PEKARE MÅSTE FÖRSTÖRAS. (DELETE)

• MINNESLÄCKOR.

• VÄLDIGT EFFEKTIVT OM DET ANVÄNDS RÄTT.

Page 4: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

HEAP & STACK, DEL 1/2.

• STACK:

• ”FIRST IN, FIRST OUT” / ”PUSH, POP”

• VÄXAR/MINSKAR, MEN HAR EN LIMITERAD KAPACITET. (OS SPECIFIK)

• NÄR ETT SCOPE LÄMNAS, FÖRSTÖRS ALL DATA.

• VÄLDIGT EFFEKTIVT.

Page 5: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

static void Main(){

int i = 0;if (i == 0){

int a = 5;int b = 15;if (a == 5){

int c = 3;int d = 99;

}}

}

Page 6: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

HEAP & STACK, DEL 2/2

• HEAP:

• EN STOR YTA MED MASSA MINNE ATT SPARA DATA I. (HIT PEKAR PEKARNA I C++ OFTAST)

• INGA RESTRIKTIONER I STORLEK.

• LITE SLÖARE ATT LÄSA FRÅN ÄN FRÅN STACK.

• ALL DATA KAN KOMMAS ÅT ÖVERALLT.

• MINNET KAN BLI FRAGMENTERAT.

Page 7: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

HUR FUNKAR DET I C#, JAVA OCH PYTHON DÅ?

• ”GARBAGE COLLECTOR” (GC)

• ALLOKERAR MINNET PÅ HEAP AUTOMATISKT.

• FRIAR DATA SOM INTE LÄNGRE HAR NÅGON REFERENS.

• ALLT MINNE PROGRAMMET KAN NÅ ÄR ”VIRTUELLT”.

Page 8: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

FÖR/NACKDELAR MED GC

• FÖRDEL:

• GÖR PROGRAMMERARENS ARBETE LÄTTARE.

• KAN NÄSTAN INTE FÅ MINNESLÄCKOR.

• NACKDEL:

• KAN SAKTA NER PROGRAM

• GÅR INTE ATT BESTÄMMA EXAKT HUR MINNET SKA ANVÄNDAS

• MINNET KAN ”FRAGMENTERAS”.

Page 9: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

NÄR FRIAS MINNE?

• NÄR DET BÖRJAR TRYTA PÅ FRITT MINNE.

• NÄR REFERENSERNA BÖRJAR BLI ”FÖR MÅNGA” (JUSTERAS AUTOMATISKT)

• NÄR MAN SÄGER ÅT GCN. EX: ”GC.COLLECT();” (C#)

Page 10: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

VALUE TYPES

• ÄR PRIMITIVER: INT, DOUBLE, FLOAT, BOOL ETC.

• KOPIERAS NÄR DE SKICKAS SOM ARGUMENT TILL EN FUNKTION.

• KAN INTE VARA ”NULL”.

• KAN INTE ÄRVAS AV.

• JAVA HAR INTE ANVÄNDARDEFINERADE VALUE TYPES.

• I C# SKAPAS DE MED ”STRUCT” NYCKELORDET.

• C++ ”STRUCT” ÄR INTE EN VALUE TYPE.

Page 11: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

static void Main(){

int i = 10;Foo(i);Console.WriteLine(”My number

is: ” + i);}

static void Foo(int number){

number++;}

>> My number is: 10

Page 12: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

REFERENCE TYPE

• KAN VARA LITE VAD SOM HELST.

• SKICKAS SOM EN REFERENS I ARGUMENT, DVS OM OBJEKTET ÄNDRAS I FUNKTIONEN, SÅ ÄNDRAS SJÄLVA OBJEKTET OCH INTE EN KOPIA AV OBJEKTET.

• REFERENCE TYPE DEFINERAS MED NYCKELORDET ”CLASS”.

• STRING ÄR EN TYP AV KLASS OCH EN REFERENCE TYPE. DEN ÄR DOCK SPECIELL I ATT DEN INTE JÄMFÖR REFERENS ADRESSEN (”DET FYSISKA OBJEKTET”), UTAN VÄRDET.

Page 13: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

static void Main(){

Vector2 v = new Vector2();v.x = 10;v.y = 20;

Foo(v);

Console.WriteLine("X: " + v.x + " Y: " + v.y));}

static void Foo(Vector2 vector){

vector.x++;vector.y++;

}

public class Vector2{

public int x;public int y;

}

>> X: 11 Y: 21

Page 14: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

C# ”REF”

• REF SKICKAR EN VARIABEL SOM EN REFERENS, OAVSÄTT OM DET ÄR EN VALUE ELLER REFERENCE TYPE.

• KAN ANVÄNDAS OM VÄRDET SKA ÄNDRAS INNE I FUNKTIONEN.

• INTE REKOMMENDERAT ATT ANVÄNDA ”FÖR MYCKET”.

Page 15: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

static void Main(){

int i = 10;Foo(ref i);Console.WriteLine(”Number is:

” + i);}

static void Foo(ref int number){

number++;}

>> Number is: 11

Page 16: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

KÄLLOR

• LÄNKAR

• HTTPS://DOCS.PYTHON.ORG/2/LIBRARY/GC.HTML

• HTTP://WWW.AARONSTECHCENTER.COM/PROS-CONS-AUTOMATIC-GARBAGE.PHP

• HTTP://GRIBBLELAB.ORG/CBOOTCAMP/7_MEMORY_STACK_VS_HEAP.HTML,

• HTTP://MSDN.MICROSOFT.COM/EN-US/LIBRARY/EE787088%28V=VS.110%29.ASPX

• HTTP://STACKOVERFLOW.COM/QUESTIONS/5057267/WHAT-IS-THE-DIFFERENCE-BETWEEN-A-REFERENCE-TYPE-AND-VALUE-TYPE-IN-C

• HTTP://YODA.ARACHSYS.COM/CSHARP/REFERENCES.HTML

• BILDER:

• HTTP://UPLOAD.WIKIMEDIA.ORG/WIKIPEDIA/COMMONS/THUMB/2/29/DATA_STACK.SVG/2000PX-DATA_STACK.SVG.PNG

• KOD:

• FELIX (JAG) :D

Page 17: static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d = 99; }

FRÅGOR?FELIX LEPISTÖ, DS13