Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Skrócony regulamin

[C++] Jak to właściwie jest ? Notacja tablicowa przy wskaźnikach.

Idź do strony 1, 2  Następny

 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> C i C++
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
ram_techen



Dołączył: 05 Lut 2009
Posty: 288

PostWysłany: Nie Lut 12, 2012 10:07 pm      Temat postu: [C++] Jak to właściwie jest ? Notacja tablicowa przy wskaźnikach. Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Numer GG WP Kontakt
marcin_an
Site Admin


Dołączył: 26 Maj 2005
Posty: 17278
Skąd: z drugiej strony Kabla

PostWysłany: Nie Lut 12, 2012 10:17 pm      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość
ram_techen



Dołączył: 05 Lut 2009
Posty: 288

PostWysłany: Nie Lut 12, 2012 10:32 pm      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Numer GG WP Kontakt
marcin_an
Site Admin


Dołączył: 26 Maj 2005
Posty: 17278
Skąd: z drugiej strony Kabla

PostWysłany: Nie Lut 12, 2012 11:03 pm      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość
izaw



Dołączył: 12 Wrz 2008
Posty: 2003
Skąd: Łódź

PostWysłany: Nie Lut 12, 2012 11:44 pm      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość
marcin_an
Site Admin


Dołączył: 26 Maj 2005
Posty: 17278
Skąd: z drugiej strony Kabla

PostWysłany: Pon Lut 13, 2012 12:03 am      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość
izaw



Dołączył: 12 Wrz 2008
Posty: 2003
Skąd: Łódź

PostWysłany: Pon Lut 13, 2012 1:31 am      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość
marcin_an
Site Admin


Dołączył: 26 Maj 2005
Posty: 17278
Skąd: z drugiej strony Kabla

PostWysłany: Pon Lut 13, 2012 1:46 am      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość
ram_techen



Dołączył: 05 Lut 2009
Posty: 288

PostWysłany: Pon Lut 13, 2012 8:32 pm      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Numer GG WP Kontakt
hejmus



Dołączył: 26 Maj 2005
Posty: 2135

PostWysłany: Pon Lut 13, 2012 8:57 pm      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> C i C++ Wszystkie czasy w strefie CET (Europa)
Idź do strony 1, 2  Następny
Strona 1 z 2

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.58271 sekund, zapytan = 7
contact

| Darmowe programy i porady Jelcyna | VB4all | Tansze zakupy w Helionie |