Alokacja pamięci

Odpowiedz Nowy wątek
2011-10-05 22:18
Piotrkek
0

public:
serch(void);
~serch(void);
---------- ZMIENNE
int i;
int r;
int j;
int a;
int b;
bool num_tab[];
--------- FUNKCJE
int sit();
---------

Tutaj przedstawiam kod pliku header mojej klasy

int serch::sit()
{
for (int i = a; ii <= b; i++ )
{
if (num_tab[i] == true)
continue;
for (j = 2
i ; j <= b; j += i)
num_tab[j] = true;
}
return 0;
}

tutaj jest funkcja sit i teraz chciałbym zalokować pamięć gdyż tak jak teraz jest to jest niebezpiecznie i przy większych liczbach się wysypuje ale nie wiem jak w tym kontekscie się za to zabrać. Jest to prosty program do wyszukiwania licz pierwszych, nie ma tutaj wypisywania, gdyż ono jest w formatce.

Pozostało 580 znaków

2011-10-06 00:39
0

//widzę, że rozmiar num_tab jest <=b, więc w deklaracji klasy
bool num_tab[] zmieniamy na
bool* num_tab;

int serch::sit()
{
num_tab = new bool[b + 1]; //mamy mem-leaka, bo nie zwlaniamy, ale chodzi o to jak zaalokować

    for (int i = a; i*i <= b; i++ )
    {
            if (num_tab[i] == true)
            continue;
            for (j = 2 * i ; j <= b; j += i)
            num_tab[j] = true;
    }
    return 0;

}

a tak w ogóle, to zamiast tablicy bool'i może lepiej zastosowac std::vector<bool>, który sam będzie zarządzał swoją pamięcią. Na początku serch::sit() sprawdzasz czy b>vector::size() i jesli tak, to wywołujesz vector::reserve(), żeby przydzielić więcej pamięci vectorowi.

w dodatku kompilator może przechowywać w vector<bool> każdego boola na pojedynczym bicie zamiast bajcie, zmniejszając zajętość pamięci ośmiokrotnie. - Azarien 2011-10-06 01:58
std::vector<bool> to zło wcielone, lepiej już użyć boost::dynamic_bitset. - Endrju 2011-10-06 20:17

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0