static void Main() { int i = 0; if (i == 0) { int a = 5; int b = 15; if (a == 5) { int c = 3; int d...
-
Upload
alexandria-brooks -
Category
Documents
-
view
278 -
download
3
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...
MINNESHANTERING OCH GARBAGE COLLECTORN
REFERENCE TYPES, VALUE TYPES, PEKARE, HEAP, STACK MED MERA.
FELIX LEPISTÖ, DS13
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.
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.
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.
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.
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”.
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”.
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#)
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.
static void Main(){
int i = 10;Foo(i);Console.WriteLine(”My number
is: ” + i);}
static void Foo(int number){
number++;}
>> My number is: 10
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.
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
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”.
static void Main(){
int i = 10;Foo(ref i);Console.WriteLine(”Number is:
” + i);}
static void Foo(ref int number){
number++;}
>> Number is: 11
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
FRÅGOR?FELIX LEPISTÖ, DS13