| Zobacz poprzedni temat :: Zobacz następny temat |
| Autor |
Wiadomość |
ram_techen
Dołączył: 05 Lut 2009 Posty: 288
|
Wysłany: Nie Lut 12, 2012 10:07 pm Temat postu: [C++] Jak to właściwie jest ? Notacja tablicowa przy wskaźnikach. |
|
|
Właśnie, jak to właściwie jest? Załóżmy że mamy następującą linijkę w programie :
| Kod: |  
 unsigned int n ;
 /* gdzieś w programie otrzymujemy n */
 int *ptr = new int[n] ;
 
|
Teraz mogę wypełnić tą tablicę na dwa sposoby :
| Kod: |  
 // pierwszy
 for(unsigned int i = 0 ; i < n ; ++i)
 *(ptr++) = i ;
 
|
albo
| Kod: |  
 for(unsigned int i = 0 ; i < n ; ++i)
 ptr[i] = i ;
 
|
Moje pytanie tyczy się optymalizacji, czy stosując ten drugi zapis kompilator "postąpi" tak, żeby kod działał tak szybko jak ten pierwszy (albo inaczej : czy są one równoważne pod względem szybkości w stosunku do wskaźników) ? |
|
| Powrót do góry |
|
 |
|
|
marcin_an Site Admin
Dołączył: 26 Maj 2005 Posty: 17278 Skąd: z drugiej strony Kabla
|
Wysłany: Nie Lut 12, 2012 10:17 pm Temat postu: |
|
|
Pytasz się o kwestie zależne od kompilatora, platformy i opcji kompilacji. Nie podałeś jednak, o jakie chodzi.
Różnice pomiędzy obydwoma zapisami, jeśli nawet kompilator wygeneruje dla nich inny kod, są w ogólnym przypadku pomijalnie małe i nie powinno mieć to wpływu na wybór sposobu zapisu. Zapis należy wybrać tak, żeby był czytelniejszy. _________________ Matematyka to taki twór, który pozwala opisać sokowirówkę jako urządzenie pobierające ujemne odpadki i produkujące z nich sok. "Lameria atakuje" | RTFM | UMLet - edytor UML inaczej | Wykłady ks.Pawlukiewicza |
|
| Powrót do góry |
|
 |
ram_techen
Dołączył: 05 Lut 2009 Posty: 288
|
Wysłany: Nie Lut 12, 2012 10:32 pm Temat postu: |
|
|
| Rozumiem, tak więc nawet, jeśli ten drugi zapis zastosowałbym na olimpiadzie informatycznej, nie odjęliby mi oni za to punktu (że nie zastosowałem szybszej konstrukcji) ? |
|
| Powrót do góry |
|
 |
marcin_an Site Admin
Dołączył: 26 Maj 2005 Posty: 17278 Skąd: z drugiej strony Kabla
|
Wysłany: Nie Lut 12, 2012 11:03 pm Temat postu: |
|
|
O to już zapytaj osoby ustalające zasady na OI. C++ nie definiuje, jakie konstrukcje mają być używane na olimpiadach ;). Ja mówię, jak jest przy pisaniu normalnego programu. A jest tak, że - jeśli nawet pojawia się w danej konfiguracji minimalna różnica - nie powinno to być brane pod uwagę przy wyborze konstrukcji, bo to jest pomijalnie mała wartość, do tego mocno zależna od tak wielu czynników, że nie da się łatwo ustalić, jak będzie w ogólnym przypadku. Kiedyś np. g++ lepiej sobie radził z zapisami bezpośrednio na wskaźnikach i było to powtarzalne, więc można było powiedzieć, że któraśtam wersja jest lepsza. To było jednak lata temu, a dzisiaj jest dzisiaj.
Jeśli jednak odejmują punkty za coś takiego, to widzę, że OI też powoli sięga dna. _________________ Matematyka to taki twór, który pozwala opisać sokowirówkę jako urządzenie pobierające ujemne odpadki i produkujące z nich sok. "Lameria atakuje" | RTFM | UMLet - edytor UML inaczej | Wykłady ks.Pawlukiewicza |
|
| Powrót do góry |
|
 |
izaw

Dołączył: 12 Wrz 2008 Posty: 2003 Skąd: Łódź
|
Wysłany: Nie Lut 12, 2012 11:44 pm Temat postu: |
|
|
Dodatkowo w pierwszym kodzie tracisz oryginalny wskaźnik na zaalokowaną tablicę. I ze zwolnieniem pamięci możesz mieć kłopoty. _________________ Program nie robi tego co chce programista, ale to co programista zaprogramował |
|
| Powrót do góry |
|
 |
marcin_an Site Admin
Dołączył: 26 Maj 2005 Posty: 17278 Skąd: z drugiej strony Kabla
|
Wysłany: Pon Lut 13, 2012 12:03 am Temat postu: |
|
|
Jeszcze nie traci: | Kod: |  ptr -= n;
|
;)
Aczkolwiek prawda, że bezpieczniej napisać do tego funkcję i przekazywać jako argument. _________________ Matematyka to taki twór, który pozwala opisać sokowirówkę jako urządzenie pobierające ujemne odpadki i produkujące z nich sok. "Lameria atakuje" | RTFM | UMLet - edytor UML inaczej | Wykłady ks.Pawlukiewicza |
|
| Powrót do góry |
|
 |
izaw

Dołączył: 12 Wrz 2008 Posty: 2003 Skąd: Łódź
|
Wysłany: Pon Lut 13, 2012 1:31 am Temat postu: |
|
|
Oryginalną wartość traci. I czy będzie pamiętać o9 cofnięciu zmian? A jeżeli pętla nie będzie trywialna i będzie mogła się zakończyć wcześniej?
Dlatego dla spokoju lepiej oryginalny wskaźnik zachować bez zmian, a pracować na kopii.
O ile wiem, to w OI zadania sprawdza sprawdzaczka i nie bawi się w czytanie źródeł. Te lęki chyba wynikają ze strachu, że nieoptymalny algorytm się nie wyrobi i zamiast popracować nad nim, stosuje pseudo optymalizacje. _________________ Program nie robi tego co chce programista, ale to co programista zaprogramował |
|
| Powrót do góry |
|
 |
marcin_an Site Admin
Dołączył: 26 Maj 2005 Posty: 17278 Skąd: z drugiej strony Kabla
|
Wysłany: Pon Lut 13, 2012 1:46 am Temat postu: |
|
|
Niestety np. SPOJ nagradza takie bzdurne nibyoptymalizacje. Jeżeli problem będzie dostatecznie prosty, to wygrają nie ci, którzy potrafią dobrać najlepsze rozwiązanie, ale właśnie osoby, których kody są średnio dobre, ale za to napchane mało istotnymi w praktyce duperelami, ale dającymi te kilka procent przewagi w oderwanych od rzeczywistości tematach. W zetknięciu z rzeczywistością poległyby z kretesem, ale środowisko sprawdzarki to specyficzny świat... _________________ Matematyka to taki twór, który pozwala opisać sokowirówkę jako urządzenie pobierające ujemne odpadki i produkujące z nich sok. "Lameria atakuje" | RTFM | UMLet - edytor UML inaczej | Wykłady ks.Pawlukiewicza |
|
| Powrót do góry |
|
 |
ram_techen
Dołączył: 05 Lut 2009 Posty: 288
|
Wysłany: Pon Lut 13, 2012 8:32 pm Temat postu: |
|
|
Ooo panowie, to był tylko taki przykład :D Ogólnie rzecz biorąc staram się zawsze stosować konstrukcje typu
| Kod: |  
 int *ptr, * const poczatek_tablicy = ptr = new int[n] ;
 /* ... */
 
 delete [] poczatek_tablicy ;
 
|
I zawsze po pętli, jeśli operowałem wskaźnikiem, wskazuję go na początek.
@izaw : wiesz, optymalizacji nigdy nie za wiele :) |
|
| Powrót do góry |
|
 |
hejmus
Dołączył: 26 Maj 2005 Posty: 2135
|
Wysłany: Pon Lut 13, 2012 8:57 pm Temat postu: |
|
|
Ehm :) | Donald Knuth napisał: | | "We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil" |
_________________ kompilacja Gentoo na Pentium MMX 233MHz - niezapomniane przeżycia ;) |
|
| Powrót do góry |
|
 |
|