Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Różna ilość pamięci alokowanej dla tablicy zmiennych a wskaźników na zmienne

Ostatnio zmodyfikowano 2019-09-29 17:38
Autor Wiadomość
dlakin95
Temat założony przez niniejszego użytkownika
» 2019-09-29 15:43:54
Zawsze można zaalokować obiekty wirtualne które są "jednego typu" w tablicy statycznej, a tam gdzie jest potrzebny dostęp do wirtualnych obiektów utworzyć tylko tablicę referencji.

C/C++
class T {
public:
    T() { };
    virtual ~T() { };
   
    virtual void print() { qDebug() << "T"; }
};

class T1
    : public T
{
public:
    T1()
        : T()
    { };
    virtual ~T1() { };
   
    virtual void print() override { qDebug() << "T1"; }
};

class T2
    : public T
{
public:
    T2()
        : T()
    { };
    virtual ~T2() { };
   
    virtual void print() override { qDebug() << "T2"; }
};

int main() {
    T1 * t1 = new T1[ 10 ];
    T2 * t2 = new T2[ 10 ];
   
    T ** t = new T *[ 20 ];
    for( uint i = 0; i < 10; i++ ) {
        t[ 2 * i ] = t1 + i;
        t[ 2 * i + 1 ] = t2 + i;
    }
    for( uint i = 0; i < 20; i++ )
         t[ i ]->print();
   
    // I żeby nie było że nie czyszczę pamięci :P
    delete[] t1;
    t1 = null;
    delete[] t2;
    t2 = null;
    delete[] t;
    t = null;
}
[/i]
P-175262
Elaine
» 2019-09-29 16:35:16
Jeżeli wiesz, że tekst nie będzie dłuższy niż np. 10 znaków, to bardziej opłaca się zdefiniować tablicę 10-znakową, niż pozwalać na to, aby std::string wykonał dynamiczną alokację dla tekstu o długości np. jednego znaku, bo i tak dynamiczna alokacja jednego znaku zje więcej pamięci, niż ta stała 10-znakowa tablica.
W każdej istotnej implementacji biblioteki standardowej dziesięcioznakowy std::string jest przechowywany wewnątrz samego std::string, bez alokacji.
P-175263
pekfos
» 2019-09-29 17:38:25
Zawsze można zaalokować obiekty wirtualne które są "jednego typu" w tablicy statycznej, a tam gdzie jest potrzebny dostęp do wirtualnych obiektów utworzyć tylko tablicę referencji.
Zaczynasz wchodzić na terytorium optymalizacji konkretnych przypadków. Nie zawsze jest sens się tym zajmować. Nie można zapominać o prawie Amdahla przy rozważaniu każdej inwazyjnej optymalizacji.
Oczywiście, możesz to zastosować do każdego przypadku pojedynczych alokacji, ale pamiętaj że mechanizm ogólnego przeznaczenia musi też umieć pamięć zwalniać i wykorzystywać ponownie. Gdzieś będziesz musiał przechowywać jakąś mapę zajętości pamięci, albo listę wolnych adresów do ponownego użycia. W najlepszym razie wiesz, że nie potrzebujesz możliwości zwalniania pamięci, ale wtedy osobne bufory na różne typy zaczynają tracić sens, bo możesz po prostu przydzielać kolejne adresy z jednej tablicy nie przejmując się fragmentacją.

tablicę referencji
Lepiej nie nazywaj rzeczy po swojemu. Nie ma czegoś takiego w C++ i standard nawet mówi mówi wprost, że nie będziesz miał [..] tablic referencji.
P-175264
1 « 2 »
Poprzednia strona Strona 2 z 2