Optymalizacja programiku

0

Witam, jestem raczkującym programistą w C++, napisałem program który ma wykonać dane operacje i spytać użytkownika czy powtórzyć wszystko jeszcze raz i tak w nieskończoność :D.
Wygląda to tak:

bool i=1;
while (i==1)
{
blablabla
blablabla...
cin>>i;
}

Moja wątpliwość dotyczy możliwości zadeklarowania zmiennej i dopiero przed samym "cin>>i", tak by nie wisiała w pamięci nie potrzebnie podczas wykonywania programu. Wiem że to tylko bool ale jednak dziwi mnie że musi ona wisieć w pamięci mimo że nie jest potrzebna.

0

Co to znaczy "nie jest potrzebna"? o_O Przecież potrzebujesz jej żeby w ogóle wejść do pętli...

0
Kamil95 napisał(a):

Witam, jestem raczkującym programistą w C++, napisałem program który ma wykonać dane operacje i spytać użytkownika czy powtórzyć wszystko jeszcze raz i tak w nieskończoność :D.
Wygląda to tak:

bool i=1;
while (i==1)
{
blablabla
blablabla...
cin>>i;
}

Moja wątpliwość dotyczy możliwości zadeklarowania zmiennej i dopiero przed samym "cin>>i", tak by nie wisiała w pamięci nie potrzebnie podczas wykonywania programu. Wiem że to tylko bool ale jednak dziwi mnie że musi ona wisieć w pamięci mimo że nie jest potrzebna.

  1. nie będzie mniej wisiała niźli teraz
  2. mozno to zoptymalizować tak:
bool i=true;
do
{
blablabla
blablabla...
cin>>i;
}while (i==true);

będziesz mieć jedno porównanie mniej

3

Ogólnie taka "optymalizacja" podchodzi pod przedwczesną optymalizację i należy jej unikać.

0

O do while to wiedziałem, ale nadal mam wątpliwość, to głupie że nie mogę skonstruować programu tak żeby zmienna znikała wtedy kiedy jest niepotrzebna. Oczywiście na początku jest potrzebna ale w trakcie działania programu nie jest potrzebna i chciałbym ją wyrzucić z pamięci. Oczywiście na sam koniec znowu będzie potrzebna wtedy chciałbym ją przywrócić. Może w C++ jest to niemożliwe.

1

@Kamil95

Moja wątpliwość dotyczy możliwości zadeklarowania zmiennej i dopiero przed samym "cin>>i", tak by nie wisiała w pamięci nie potrzebnie podczas wykonywania programu.
To będzie jescze bardziej kosztowne, bo będzie tworzona nowa zmienna przy każdej iteracji.

O do while to wiedziałem, ale nadal mam wątpliwość, to głupie że nie mogę skonstruować programu tak żeby zmienna znikała wtedy kiedy jest niepotrzebna. Oczywiście na początku jest potrzebna ale w trakcie działania programu nie jest potrzebna i chciałbym ją wyrzucić z pamięci. Oczywiście na sam koniec znowu będzie potrzebna wtedy chciałbym ją przywrócić. Może w C++ jest to niemożliwe.

Ta zmienna musi cały czas istnieć, bo warunkuje zakończenie pętli, poza tym tak jak napisał @twonek, to co chcesz zrobić to absolutnie zbędna optymalizacja.

0

Nie chce żeby była tworzona nowa zmienna tylko żeby jeszcze raz powstała zmienna i którą wcześniej wyrzuciłem z pamięci.

0

"Ta zmienna musi cały czas istnieć, bo warunkuje zakończenie pętli."
No to w takim razie C++ wg mnie jest dziwnie skonstruowany bo ja mam zamiar tą zmienną zrobić na nowo przed kolejnym sprawdzeniem pętli ale po co ta zmienna ma istnieć w trackie pętli.

0

No to w takim razie C++ wg mnie jest dziwnie skonstruowany bo ja mam zamiar tą zmienną zrobić na nowo przed kolejnym sprawdzeniem pętli ale po co ta zmienna ma istnieć w trackie pętli.

Inaczej sie nie da, za dużo kombinujesz.

0

No cóż, dzięki za pomoc

1

Masz spore braki w podstawach. Poczytaj sobie jak działa stos. Zakładając że w środku pętli masz jakieś dodawanie, spróbuj rozpisać sobie to na kartce.

Samo cin>> robi tutaj masę dodatkowego kodu, który jest podlinkowany więc go nie widzisz. Ale generalnie próbujesz na siłę skrócić sobie drogę o metr, a dalej robisz decyzję która dodaje Ci kilka dodatkowych kilometrów do przejścia.

0

No ale cin>> istnieje tak czy siak

1
Kamil95 napisał(a):

"Ta zmienna musi cały czas istnieć, bo warunkuje zakończenie pętli."
No to w takim razie C++ wg mnie jest dziwnie skonstruowany bo ja mam zamiar tą zmienną zrobić na nowo przed kolejnym sprawdzeniem pętli ale po co ta zmienna ma istnieć w trackie pętli.

Jeśli dobrze zrozumiałem Twój tok rozumowania, to chcesz coś w tym stylu:

while (true)
{
    do_something();
    
    bool out;
    cin >> out;
    if (out) 
        break;
}

Przy czym powtarzam, poświęcenie czasu na taki rozkminki typu "jak unikać jednej zmiennej" jest absolutne bezsensowne. I nie wiadomo czy takie coś jest szybsze/wydajniejsze od wersji ze zmienną.

0

No dobra, z tym bool`em to przesada, ale gdyby tam była zmienna o potężnej wartości a potem i tak użytkownik miałby podać nową wartość to przecież powinna istnieć możliwość usunięcia tej zmiennej z pamięci.

1

Tak czy siak, to istnieje kilkadziesiąt instrukcji procesora. Żeby użyć cin musisz dodać biblitekę do programu która powiększy Ci go o parę kilobajtów - to raz. Dwa że wartość tej zmiennej i tak istnieje na stosie.

Wyobraź sobie sytuację. Umawiam się z tobą że co jakiś czas będziesz sprawdzał komórkę i wyślę Ci na nią jakiegoś smsa. Na początku musisz mi podać numer telefonu. A ty Teraz chcesz wywalić komórkę do oceanu bo jest za ciężka, a potem magicznie wyczarować kolejna komórkę z magicznie tym samym numerem telefonu. Widzisz jakieś rozwiązanie tej sytuacji?

0

OK Macie racje, dzięki

0

Z tymże cin muszę użyć tak czy siak, bo to użytkownik decyduje czy wykonywać program jeszcze raz.

0

Musisz, racja, więc po prostu tego użyj. Jeżeli kiedyś napisany przez Ciebie program będzie chodził źle to dopiero zastanów się nad optymalizacją. Zbyt szybko się martwisz.

0

Tutaj akurat nie potrzebnie gdybałem ale z takim podejściem jak ty to chyba pisali Windowsa :D

0

Bardzo możliwe. W inny wypadku w tym roku byłaby premiera win95 :).

0

No wiesz ale linux zabiera tak jakby 20 razy mniej pamięci. :D

0

No przesadziłem tzn tyle zużywa z najmniejszym środowiskiem graficznym. Z XFCE zużywa "tylko" 5 razy mniej. :D

0

Więc używaj linuxa :). Ale muszę Cię zmartwić. Tam też nikt nie myślał o usuwaniu obiektów ze stosu bo przez chwilę nie są potrzebne.

0

Muszę doczytać co to ten stos :)

0

Tak naprawdę wcale nic nie optymalizujesz. I mam na myśli nic że nic, a nie nic że mało.

bool i=1;
while (i==1)
{
    blablabla
    blablabla...
    cin>>i;
}
...

Tak naprawdę ta zmienna jest na stosie cały czas od rozpoczęcia wywołania funkcji do zakończcenia. Stos to taki kawałek pamięci programu (powiedzmy że "tablica") w której są przechowywane zmienne lokalne (to uproszczenie duże oczywiście, ale powiedzmy).
No i niezależnie czy ta zmienna tam będzie czy nie, pamięc na stos tak czy inaczej jest zarezerwowana. Tak samo nie da się "zwolnić" pamięci zajmowanej przez zmienną na stosie, bo stos jak był tak zostanie w pamięci.

OT:

Tutaj akurat nie potrzebnie gdybałem ale z takim podejściem jak ty to chyba pisali Windowsa :D

Twoi koledzy od linuxa się chyba nie zgadzają, bo ostatnio np. wyrównanie stosu w gcc zmieniono na 16 bajtów ;) (to znaczy że każde wywołanie funkcji zajmuje przynajmniej 16 bajtów na stosie, niezależnie od ilości parametrów). I to dla dobrze zrozumianej wydajności.

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