26. maj 2001 - 19:18
Der er
5 kommentarer og 2 løsninger
Ramstyring og objekter
Hvis et objekt er fuldstændig statisk, dvs. det ikke indeholde nogen dynamiske strukture, eller pointer. Kan man så regne med at det ligger sammehængende i hukommelsen uden nogen huller? Også hvis det er er oprettete dynamsikt? Når man opretter objekter dynamisk og fjerne dem igen med delete, og bruger dette meget, vil rammen så ikke blive fragmenteret? Eller genbruger styrersystemet hukommelsen på en eller anden smart måde? (defragmentering)
Annonceindlæg tema
Du kan ikke *regne* med noget, men det vil være korrekt at antage. Hvordan det så ret faktisk forholder sig afhænger af operativ systemet. Jo, rammen bliver fragmenteret. Heldigvis er hukommelsesstyring ret effektiv på de fleste flatforme i dag, hvorfor det ikke plejer at give problemer. Ligesom med harddiske sørger hukommelses manageren for med jævne mellemrum at defragmentere rammen.
En struct og et array er altid fortløbende, under forudsætning af de er statiske. Jens B
borrisholt >> Hvad med attributter i et object. F.eks tre integers. Kan man være sikker på, at de ligger efter hinanden?
stigc >> Det er jeg ikke klar over ... Men vi kan da lave en lille halvt bevis for det ene eller det andet : Lave et program der indeholder to klasser, ude lukkende med statiske datamedlemmer. Hvis du på skift kan oprette og ned lægge de to objekter sig 10.000 gange og de ALLE gangene har datamedlemmerne fortløbende mem adresser. Mon så ikke de har det altid. Som sagt jeg ved det ikke, med min lille test ville være et godt bud på det ene eller det andet. Jens B
det her lille test program giver i hvertfaldt fortløbende mem adresser : // MemTest.cpp : Defines the entry point for the console application. // #include \"stdafx.h\" class CHorse { public: int a; }; class CCheval { public: int a; int b; }; class CHest { public: int a; int b; int c; }; class CPferde { public: int a; int b; int c; int d; }; int Horse_a = 0; int Cheval_a = 0; int Cheval_b = 0; int Hest_a = 0; int Hest_b = 0; int Hest_c = 0; int Pferde_a = 0; int Pferde_b = 0; int Pferde_c = 0; int Pferde_d = 0; int main(int argc, char* argv[]) { for (int i=0; i<1000000; ++i) { CHorse *Horse = new CHorse(); Horse->a = i; if ((int)&Horse->a != Horse_a) { Horse_a = (int)&Horse->a; printf(\"&Horse->a %d\\n\", Horse_a); } delete Horse; CCheval *Cheval = new CCheval(); Cheval->a = i; Cheval->b = i; if ((int)&Cheval->a != Cheval_a) { Cheval_a = (int)&Cheval->a; printf(\"&Cheval->a %d\\n\", Cheval_a); } if ((int)&Cheval->b != Cheval_b) { Cheval_b = (int)&Cheval->b; printf(\"&Cheval->b %d\\n\", Cheval_b); } delete Cheval; CHest *Hest = new CHest(); Hest->a = i; Hest->b = i; Hest->c = i; if ((int)&Hest->a != Hest_a) { Hest_a = (int)&Hest->a; printf(\"&Hest->a %d\\n\", Hest_a); } if ((int)&Hest->b != Hest_b) { Hest_b = (int)&Hest->b; printf(\"&Hest->b %d\\n\", Hest_b); } if ((int)&Hest->c != Hest_c) { Hest_c = (int)&Hest->c; printf(\"&Hest->c %d\\n\", Hest_c); } delete Hest; CPferde *Pferde = new CPferde(); Pferde->a = i; Pferde->b = i; Pferde->c = i; Pferde->d = i; if ((int)&Pferde->a != Pferde_a) { Pferde_a = (int)&Pferde->a; printf(\"&Pferde->a %d\\n\", Pferde_a); } if ((int)&Pferde->b != Pferde_b) { Pferde_b = (int)&Pferde->b; printf(\"&Pferde->b %d\\n\", Pferde_b); } if ((int)&Pferde->c != Pferde_c) { Pferde_c = (int)&Pferde->c; printf(\"&Pferde->c %d\\n\", Pferde_c); } if ((int)&Pferde->d != Pferde_d) { Pferde_d = (int)&Pferde->d; printf(\"&Pferde->d %d\\n\", Pferde_d); } delete Pferde; } return 0; } Jens B
hvor imod hvis du lader klasserne arve fra hinanden så får de ikke fortløbende adresser : // MemTest.cpp : Defines the entry point for the console application. // #include \"stdafx.h\" #define ARV #ifndef ARV class CHorse { public: int a; }; class CCheval { public: int a; int b; }; class CHest { public: int a; int b; int c; }; class CPferde { public: int a; int b; int c; int d; }; #else class CHorse { public: int a; }; class CCheval : virtual public CHorse { public: int b; }; class CHest : virtual public CCheval { public: int c; }; class CPferde : virtual public CHest { public: int d; }; #endif int Horse_a = 0; int Cheval_a = 0; int Cheval_b = 0; int Hest_a = 0; int Hest_b = 0; int Hest_c = 0; int Pferde_a = 0; int Pferde_b = 0; int Pferde_c = 0; int Pferde_d = 0; int main(int argc, char* argv[]) { for (int i=0; i<10000; ++i) { CHorse *Horse = new CHorse(); Horse->a = i; if ((int)&Horse->a != Horse_a) { Horse_a = (int)&Horse->a; printf(\"&Horse->a %d\\n\", Horse_a); } delete Horse; CCheval *Cheval = new CCheval(); Cheval->a = i; Cheval->b = i; if ((int)&Cheval->a != Cheval_a) { Cheval_a = (int)&Cheval->a; printf(\"&Cheval->a %d\\n\", Cheval_a); } if ((int)&Cheval->b != Cheval_b) { Cheval_b = (int)&Cheval->b; printf(\"&Cheval->b %d\\n\", Cheval_b); } delete Cheval; CHest *Hest = new CHest(); Hest->a = i; Hest->b = i; Hest->c = i; if ((int)&Hest->a != Hest_a) { Hest_a = (int)&Hest->a; printf(\"&Hest->a %d\\n\", Hest_a); } if ((int)&Hest->b != Hest_b) { Hest_b = (int)&Hest->b; printf(\"&Hest->b %d\\n\", Hest_b); } if ((int)&Hest->c != Hest_c) { Hest_c = (int)&Hest->c; printf(\"&Hest->c %d\\n\", Hest_c); } delete Hest; CPferde *Pferde = new CPferde(); Pferde->a = i; Pferde->b = i; Pferde->c = i; Pferde->d = i; if ((int)&Pferde->a != Pferde_a) { Pferde_a = (int)&Pferde->a; printf(\"&Pferde->a %d\\n\", Pferde_a); } if ((int)&Pferde->b != Pferde_b) { Pferde_b = (int)&Pferde->b; printf(\"&Pferde->b %d\\n\", Pferde_b); } if ((int)&Pferde->c != Pferde_c) { Pferde_c = (int)&Pferde->c; printf(\"&Pferde->c %d\\n\", Pferde_c); } if ((int)&Pferde->d != Pferde_d) { Pferde_d = (int)&Pferde->d; printf(\"&Pferde->d %d\\n\", Pferde_d); } delete Pferde; } return 0; } Jens B
aah det er fordi jeg arver virtuelt. Ellers så blive de fortløbende : // MemTest.cpp : Defines the entry point for the console application. // #include \"stdafx.h\" #ifdef VIRTUAL_ARV #define VIRTUAL virtual #else #define VIRTUAL #endif #define ARV #ifndef ARV class CHorse { public: int a; }; class CCheval { public: int a; int b; }; class CHest { public: int a; int b; int c; }; class CPferde { public: int a; int b; int c; int d; }; #else class CHorse { public: int a; }; class CCheval : VIRTUAL public CHorse { public: int b; }; class CHest : VIRTUAL public CCheval { public: int c; }; class CPferde : VIRTUAL public CHest { public: int d; }; #endif int Horse_a = 0; int Cheval_a = 0; int Cheval_b = 0; int Hest_a = 0; int Hest_b = 0; int Hest_c = 0; int Pferde_a = 0; int Pferde_b = 0; int Pferde_c = 0; int Pferde_d = 0; int main(int argc, char* argv[]) { for (int i=0; i<10000; ++i) { CHorse *Horse = new CHorse(); Horse->a = i; if ((int)&Horse->a != Horse_a) { Horse_a = (int)&Horse->a; printf(\"&Horse->a %d\\n\", Horse_a); } delete Horse; CCheval *Cheval = new CCheval(); Cheval->a = i; Cheval->b = i; if ((int)&Cheval->a != Cheval_a) { Cheval_a = (int)&Cheval->a; printf(\"&Cheval->a %d\\n\", Cheval_a); } if ((int)&Cheval->b != Cheval_b) { Cheval_b = (int)&Cheval->b; printf(\"&Cheval->b %d\\n\", Cheval_b); } delete Cheval; CHest *Hest = new CHest(); Hest->a = i; Hest->b = i; Hest->c = i; if ((int)&Hest->a != Hest_a) { Hest_a = (int)&Hest->a; printf(\"&Hest->a %d\\n\", Hest_a); } if ((int)&Hest->b != Hest_b) { Hest_b = (int)&Hest->b; printf(\"&Hest->b %d\\n\", Hest_b); } if ((int)&Hest->c != Hest_c) { Hest_c = (int)&Hest->c; printf(\"&Hest->c %d\\n\", Hest_c); } delete Hest; CPferde *Pferde = new CPferde(); Pferde->a = i; Pferde->b = i; Pferde->c = i; Pferde->d = i; if ((int)&Pferde->a != Pferde_a) { Pferde_a = (int)&Pferde->a; printf(\"&Pferde->a %d\\n\", Pferde_a); } if ((int)&Pferde->b != Pferde_b) { Pferde_b = (int)&Pferde->b; printf(\"&Pferde->b %d\\n\", Pferde_b); } if ((int)&Pferde->c != Pferde_c) { Pferde_c = (int)&Pferde->c; printf(\"&Pferde->c %d\\n\", Pferde_c); } if ((int)&Pferde->d != Pferde_d) { Pferde_d = (int)&Pferde->d; printf(\"&Pferde->d %d\\n\", Pferde_d); } delete Pferde; } return 0; } Jens B
Kurser inden for grundlæggende programmering