[C]Deklarowanie zmiennej w petli for, a wydajnosc

0

Czy zastąpienie instrukcji {for(int i=0;i <n: i++)} instrukcją {int i; for(i=0;i<n; i++)} przyspieszy działanie programu?

Takie zadano mi pytanie. Język to niby ANSI C, ale jako że 1. kawalek kodu jest w ANSI C niepoprawny można założyć, że chodzi o C99.
Poprawna odpowiedzią jest, że tak i stad moje wątpliwości, bowiem nie widzę powodu dla którego 2. rozwiązanie było by szybsze.

Z góry dzięki za odpowiedź.

0
Jarek311 napisał(a)

Czy zastąpienie instrukcji {for(int i=0;i <n: i++)} instrukcją {int i; for(i=0;i<n; i++)} przyspieszy działanie programu?
Poprawna odpowiedzią jest, że tak

Poprawną odpowiedzią jest, że nie wiadomo, i że zależy to od kompilatora i jego ustawień. Jedynym sposobem stwierdzenia jest pomiar, i też będzie to tylko wynik dla konkretnego kompilatora, a nawet dla konkretnego przypadku.

i stad moje wątpliwości, bowiem nie widzę powodu dla którego 2. rozwiązanie było by szybsze.

Jeśli już, to może się okazać odwrotnie (kiepski kompilator mógłby trzymać pierwsze i w rejestrze a drugie w pamięci) ale to jest puste gdybanie.
Pytanie jest głupie.

0

Zwłaszcza, że jeśli dobrze pamiętam pamięć dla obu jest rezerwowana w tym samym czasie (podczas wywołania, jako że są to zmienne automatyczne) i różnią się tylko zasięgiem przestrzeni nazw, no i tym, że jedna jest incjowana poza instrukcja deklaracji (dla int pewnie żadna różnica ale dla większych struktur to była by duża strata na wydajności)

0

Inicjalizacja zmiennej to O(1), póki jest w zasięgu lokalnym to realnej różnicy nie ma - przestrzeń na zmienne jest i tak tworzona na wejściu do funkcji, moment przypisania wartości początkowej nie ma znaczenia. Kompilatorowi bez róznicy jeżeli chodzi o umieszczenie w rejestrze - o tym i tak decyduje na podstawie nie zasięgu a użycia...

0

To nie powinno miec wplyw na wydajnosc poniewaz int i=0 jest wykonywane tylko raz na poczatku for. Kto ukladal te pytania i odpowiedzi?

0

Stawiam, że durny 'pan od informatyki' w jakimś liceum, tacy mają podobne pomysły... W praktyce odpowiadać trzeba na logikę bo ma się to nijak do samego języka.

0
  1. deklaracja zmiennej w ten sposob to jedyna możliwość zadeklarowania indeksu petli niewidocznego poza nia
  2. standard jezyka roznie to przewiduje (jak widać niżej).
  3. deklaracja wewnatrz/na zewnatrz petli nie wplywa na predkosc kodu.
int main(){
  for(int i=0;i<10;i++);
  int j;
  for(j=0;j<10;j++);
  return 0;
}
> gcc fori.c
fori.c: In function 'main':
fori.c:2: error: 'for' loop initial declaration used outside C99 mode
> g++ fori.c
>
0

Może po prostu powinno być for(dekl; warunek; instr){int i;} i {int i; for(dekl;warunek;instr);}

Wtedy może być jakaś różnica, choć jak czytałem to dla typów wbudowanych (int, float itd) te deklaracje sa zwykle kompilowane do równoważnego kodu (dopóki nie ma inicjalizacji zmiennej w pętli).

To pytanie na hashówke (rodzaj testu) na Politechnice Wro.

Jednak zaznaczę, że ciut skłamałem i pytanie znam od osób które już to pisały, treść tego zadania pośród piszących jest jednak merytorycznie stała.

No i dodam, iż zdarzają się pytania o sens jakiegoś kodu (zwykle formalnie poprawnego), więc i to pytanie może być samo w sobie bezsensowne.

Cóż skoro wszyscy się zgadzają, że nie ma różnicy to temat można zamknąć.

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