Różna ilość pamięci alokowanej dla tablicy zmiennych a wskaźników na zmienne
Ostatnio zmodyfikowano 2019-09-29 17:38
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. 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(); delete[] t1; t1 = null; delete[] t2; t2 = null; delete[] t; t = null; }
[/i] |
|
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. |
|
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ą. 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. |
|
1 « 2 » |