[c++] Czy warto stosować więcej zmiennych?

0

Co jest szybsze?
To:

vector<string> k;
...
...
if(k.size()>2)
...
if(k.size()==5)
..
..
int a=5+k.size();

Czy to:

vector<string> k;
...
...
int x=k.size()
if(x>2)
...
if(x==5)
..
..
int a=5+x;

Dotychczas pomijałem stosowanie zmiennych pośrednich, ale dzisiaj doszedłem do wniosku, że to jest poważny błąd. Czy mam rację?

0

Wiadomo że szybsze jest to kiedy zapamiętujesz wartość, ale rośnie ci ilość używanej pamięci ;)
Jeśli pobierasz tą wartość kilka razy to opłaca się ją pamiętać.

0

A jak jest ze zmiennymi. Lepiej dawać globalnie zmienne takie, które są indeksami np.

function1()
{
int i;
int j;
}
function2()
{
int i;
int j;
}

czy lepiej tak:

static int i,j;
function1()
{
}
function2()
{
}

To w tym drugim przypadku o 8 bajtów więcej będzie zawierał program (int - 4 bajty) tak????

0

Najpierw naucz się programować i myśleć logicznie, potem się takimi 'problemami' przejmuj.

0

Te 2 pierwsze etapy już za mną joey. Stąd takie pytania.

0
dede89_ napisał(a)

Te 2 pierwsze etapy już za mną joey. Stąd takie pytania.

No, ten drugi etap nie do końca. ;-) Ale NVM, to zależy co w danym momencie robisz i ile jesteś w stanie poświęcić konkretnych zasobów. Przy małych aplikacjach to nie będzie miało żadnego znaczenia, przy większych - to już zależy od ich przeznaczenia. Od zawsze pojawia się taki dylemat, albo pamięć albo prędkość, the choice is yours.

0

Ogólnie jest taka zasada żeby zmienne tworzyc na "najniższym poziomie zakresu", tzn jeśli dana zmienna jest ci potrzebna tylko w jakims bloku to tworzysz ją właśnie tam. Eliminuje to błędy związane z błędnym użyciem starej wartości zmiennej. Odstępstwa od tego są raczej rzadkością i z reguły mają po prostu jakieś uzasadnienie (np. przerywasz pętle wczesniej i chcesz wiedziec przy której iteracji się to stało, wtedy warto sobie zmienną po której iterujesz, np. jakieś i, stworzyć przed pętlą).

0

To kolejne pytanie. Kryterium w tym pytaniu jest prędkość wykonywania programu(ważne co do milisekundy, a nawet bardziej dokładnie). A więc czy lepiej stosować klasę vector, deklarację tablic za pomocą operatora new czy trzecie deklarację tablic za pomocą malloca? Gdzieś kiedyś czytałem, że najszybszy jest malloc bo jest alokowany na stosie a new alokuje na stercie, ale gdzieś znowu indziej czytałem, że lepiej używać klasy vector, bo ci co ją tworzyli najlepiej z nas wszystkich wiedzą jak operować na tablicach i nie ma sensu ich poprawiać poprzez własne tworzenie tablic za pomocą malloców czy new. Tak więc jak zakładamy, że programista umie się poprawnie posługiwać operatorami mallociem, new, klasa vector i kryterium jest prędkość wykonywania aplikacji (wygody ani szybkości implementacji nie bierzemy pod uwagę) to co jest najlepsze? Jest to ważne pytanie dla mnie to proszę o poważną odpowiedź.

0

Najlepsze pod względem szybkości? malloc(). Prawie tak samo szybkie, a wygodniejsze new[]. O wolniejsze ale także o wiele wygodniejsze vector.
Wszystkie alokują na stercie to raz.
Dwa, jeśli zadajesz takie pytania, to znaczy że bardzo słabo jeszcze umiesz programować i musisz bardzo uważać jeśli chcesz używać new/malloc i nie robic wycieków pamięci. Niewprawne używanie może okazać się wolniejsze i gorsze od używania vectora.

Zresztą rozpatruj to tak: jeśli wielkość tablicy będzie znana w jakiejś chwili i potem będzie stała to można śmiało używać new czy malloc. Ale jeśli ilość elementów ma być np. dynamicznie zmieniana, to wtedy tak czy siak będziesz pisał "własny vector" i lepiej sobie odpuścić.

0

a co to są wycieki pamięci, bo już się nieraz z tym spotkałem? To tylko i wyłącznie się one pojawiają jak się zapomni zwolnić pamięci po użyciu new czy malloca??? Czy jeszcze w jakiejś innej sytuacji mogą się pojawić w związku z new, ewentualnie mallociem? Czasem zdarza mi się zapominać po użyciu operatora new aby zwolnić pamięć, ale tak prawdę mówiąc to nic się nie dzieje. Program się zamyka i tyle. Zero konsekwencji. A co się stało z tą pamięcią co zapomniałem zwolnić to gdzieś czytałem, że ... sama się zwalnia z chwilą zamknięcia programu. Więc w sumie tylko na czas wykonywania programu jak zapomnę zwolnić pamięci to mam zajętą nadmiarowo pamięć dla dalszej części programu, ale zwykle to jest parę bajtów więc taki wyciek to tam może sobie być.:)

0

a co do programowania czy słabo umiem czy nie to mam za sobą doświadczenie w życiu w postaci około 50 tys. linijek kodu jakby tak zliczyć to wszystko. Programowałem pętle for, while, do itp. które były złożone na poziomie 8 w sobie:) Są takie algorytmy gdzie taka sytuacja występuje i nie da rady inaczej.

0
dede89_ napisał(a)

a co do programowania czy słabo umiem czy nie to mam za sobą doświadczenie w życiu w postaci około 50 tys. linijek kodu jakby tak zliczyć to wszystko.

Wiesz, linie kodu moze kazdy klepać.

0

Więc w sumie tylko na czas wykonywania programu jak zapomnę zwolnić pamięci to mam zajętą nadmiarowo pamięć dla dalszej części programu, ale zwykle to jest parę bajtów więc taki wyciek to tam może sobie być.

Tak, załóżmy że gubisz 1 kB i robisz to za każdym razem w pętli o 2000 iteracji. W ten sposób masz wyciek prawie 2 MB. Załóżmy, że ta pętla wykonuje się w programie średnio co minutę, a program chodzi przez 5 godzin. W ten sposób masz wyciek 600 MB. Mało?

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