Avatar billede stigc Nybegynder
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)
Avatar billede nebula Nybegynder
28. maj 2001 - 02:34 #1
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. 
Avatar billede borrisholt Novice
28. maj 2001 - 08:15 #2
En struct og et array er altid fortløbende, under forudsætning af de er statiske.


Jens B
Avatar billede stigc Nybegynder
28. maj 2001 - 20:27 #3
borrisholt >> Hvad med attributter i et object. F.eks tre integers. Kan man være sikker på, at de ligger efter hinanden?
Avatar billede borrisholt Novice
29. maj 2001 - 09:54 #4
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
Avatar billede borrisholt Novice
29. maj 2001 - 10:24 #5
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
Avatar billede borrisholt Novice
29. maj 2001 - 10:28 #6
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
Avatar billede borrisholt Novice
29. maj 2001 - 10:32 #7
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
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester