[C++] Szybkie zerowanie tablicy struktur.

0

Witam. Mam tablice struktur

struct oko
{
    bool jest;
    short dzieci[4][2];								
    short ile_dzieci;								
};

struct oko tablica[2000][2000];

Musze zerowac wielokrotenie ta tablice, a w zasadzie tylko boola jest. na razie robie to przez

memset(tablica, 0, sizeof(tablica) );

Jest to zdecydowanie za długie rozwiązanie (zeruje 40 000 000 elementow zamiast 4 000 000).

Jak zrobic, aby w ten sposob zerowaly sie tylko boole .jest ?

0

"Ręcznie" za pomocą pętli (2 pętli for?)

for (int i=0;i<2000;i++)
 for (int j=0;i<2000;j++)
  tablica[i][j].jest=false;

?
Albo inacze, może jeszcze szybciej:

int licznik=0;
struct oko* wsk=tablica;
while (licznik<4000000)
{
*(wsk++).jest=false;
licznik++;
}
0
Shalom napisał(a)

"Ręcznie" za pomocą pętli (2 pętli for?)

for (int i=0;i<2000;i++)
 for (int j=0;i<2000;j++)
  tablica[i][j].jest=false;

?
Albo inacze, może jeszcze szybciej:

int licznik=0;
struct oko* wsk=tablica;
while (licznik<4000000)
{
(wsk++).jest=false;
licznik++;
}

2 petle for sa ponad 2 razy wolniejsze, zaraz sprawdze to z wskaznikiem.

a moze da rade zrobic memseta na wskazniku, tak zeby czyscil tylko tego boola ?

bee te wskazniki w ogole nie dzialaja ;[

0

Byc moze po prostu calkowicie niepoprawnie zorganizowales dane w swoim programie, ze:

  1. potrzebujesz trzymac tak ogromna (alokowana statycznie?!) tablice;
  2. potrzebujesz jednoczesnie zerowac tak ogromna tablice.

Moze potrzebujesz jakiejs innej struktury danych; przykladowo osobna lista lub tablice jednowymiarowa, ktora trzyma wskazniki na wszystkie rekordy z JEST = TRUE, zamiast osobnego pola w indywidualnych instancjach struktury.

Nie zawsze program bywa wolny, bo operacji nie da sie zrobic szybciej. Czasem jest wolny, bo wybrany sposob przetwarzania jest nieefektywny.

0

Dokładnie tak jak przedmówca. Źle to zorganizowałeś. Opisz zadanie to pomożemy.

0

ok, juz kolega podsuną mi pomysł :P

zeruje tablice w czasie rzeczywistym, zaraz po wykonaniu operacji,

z 40 000 000 elementow zrobilo sie maksymalnie 100 000

0

w tej opcji ze wskaźnikiem był bląd (brak dereferencji na wskaźniku, jakos mi się ta gwiazdka zjadla ;P).
Zamiast bezmyślnie kopiować mogłeś przeczytać to byś zauważyl;]

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