Usuwanie struct by nie zajmował pamięci

Usuwanie struct by nie zajmował pamięci
TR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0
Kopiuj
 struct pole{
	int ilosc;
	int maks;
};

Będę miał listę takich structow, wrzucając je:

Kopiuj
pole x;
x.ilosc = 3;
x.maks = 4;
MojaLista[2] = x;

I takie pytanie, co sie dzieje gdy zrobie nowy struct i nadpisze w tej tablicy ten x? chodzi mi głównie o pamięć bo mam dostępne tylko 8mb.

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
3
Kopiuj
pole x;
x.ilosc = 3;
x.maks = 4;
MojaLista[2] = x;

Bez sensu ten kod. Tworzysz obiekt, a następnie go kopiujesz do tablicy.
Jeśli tablica jest typu struct pole[], to obiekty istnieją w niej cały czas. Wystarczy wypełnić wartości:

Kopiuj
MojaLista[2].ilosc = 3;
MojaLista[2].maks = 4;
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
3

Masz tablicę struktur, a nie wskaźników na struktury - zatem przypisanie MojaLista[2] = x; powoduje skopiowanie tej struktury do tablicy - w tym momencie staje się ona niezależna od pierwotnej zmiennej.
Można by to luźno przetłumaczyć na:

Kopiuj
memcpy(&MojaLista[2], &x, sizeof(x));

Tak więc robiąc następne przypisanie pod dany element tablicy, nie masz żadnego wycieku danych (w tym konkretnym przypadku).

Na przykładzie:

Kopiuj
void test() {
  // utworzenie struktury na stosie
  Pole p;

  // przypisanie danych do utworzonej struktury
  p.ilosc = 10;
  p.maks = 50;

  // skopiowanie wszystkich danych struktury do tablicy
  MojaLista[2] = p;

  // (automatycznie) usunięcie struktury ze stosu, bilans pamięciowy na zero
}

Przy czym ten sam kod można by skrócić do:

Kopiuj
void test() {
  MojaLista[2].ilosc = 10;
  MojaLIsta[2].maks = 10;
}
MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
1

Brak konkretów!
Opisz najpierw dokładnie jaki masz problem algorytmiczny. Może się okazać, że zamartwiasz się na zapas.
Z taką strukturą problem z pamięcią pojawi się jeśli twój wektor/tablica będzie miał rozmiar co najmniej rzędu 1e5.

TR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4
0

Mam 3 tablice 5000 struktur.
Teraz w 5 tysiacach kroków musze dodawać jedną taką tablicę 5000 struktur ale pierwsza z 3 które posiadam nie jest mi już potrzebna wiec chciałbym ją "nadpisać"
Jednak zastanawiam sie czy nie stworze 5000*5000 struktur.

edit.

może lepszym pomyslem bedzie nie nadpisywanie tablicy struktur tylko edytowanie wartości struktur w tej tablicy tak by były nowymi strukturami?

edit 2

Kopiuj
// skopiowanie wszystkich danych struktury do tablicy
  MojaLista[2] = p;
 
  // (automatycznie) usunięcie struktury ze stosu, bilans pamięciowy na zero 

A co sie dzieje ze strukturą która byla przed skopiowaiem p w MojaLista[2]?

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

Po nadpisaniu przez inną wartość każda poprzednia wartość zostaje utracona, niezależnie od tego czym jest ta wartość (pojedyncza składowa, struktura, wskaźnik - bez znaczenia), oraz niezależnie od tego gdzie ta wartość się znajdowała (w pojedynczej zmiennej, w tablice, w strukturze).

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
3
TrzyRazyCztery napisał(a):

Jednak zastanawiam sie czy nie stworze 5000*5000 struktur.

sizeof(pole)50005000=2e8
a ty masz pamięci 8e6, no to teraz zgadnij czy to ma szansę powodzenia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.