Jak można zoptymalizować kod napisany w C++ przy pomocy wskaźników?

0

Cześć.
Postanowiłem dzisiaj wrócić troszeczkę do tematu C++ a konkretniej to do wskaźników. Wróciłem bo zafascynowały mnie ostatnio jakieś rózne i dziwne operacje, dzięki którym kod może stać się wydajniejszy. Przeglądałem masę różnych artykułów o wskaźnikach w sieci i wszędzie znalazłem jedynie odpowiedzi na pytanie jak z nich korzystać ale nigdzie nie znalazłem odpowiedzi kiedy to robić. Liczę na to, że od Was uzyskam taką odpowiedź.

Jeśli chodzi o wskaźniki to widzę jedynie takie błahe zastosowania jak:

  • przekazywanie tablicy do funkcji;
  • przekazywanie argumentów przez referencje (adres) (przez wskaźnik w ANSI C więc to chyba to samo w C++?);
  • dynamiczne tworzenie tablic,obiektów,zmiennych;
  • callback

Jednak wydaje mi się to zbyt proste jak na możliwości, które one oferują dlatego liczę, że wskażecie mi coś więcej.
Jak można zoptymalizować kod napisany w C++ przy pomocy wskaźników?

Wyciągnięte z tutoriala QT:

explicit Notepad(QWidget *parent = 0); 

No i po co tutaj ta gwiazdka? Nie obeszło by się bez niej?
Kolejny przykład - drzewo binarne:

 struct node{
int key;
struct node *lewy;
struct node *prawy;
}*korzen=NULL;

Po co tutaj ten wskaźnik..?

0

o_O
W pierwszym przypadku wskaźnik jest dość oczywisty - chcesz do funkcji przekazać ORYGINAŁ obiektu. Jakby gwiazdki nie było to byś ten obiekt skopiował. A ty chcesz modyfikować oryginał..
W drugim przypadku powód jest prozaiczny - autor kodu chce alokować pamięć dla listy dynamicznie więc musi mieć wskaźniki.

0

pamiętaj że optymalizacją dzieli się na
1) wydajnościową
2) pamięciową (ile zajmuję)

Oba lepiej otrzymywać za pomocą algorytmów niż za pomocą "super-hakerskich" zapisków bo przeważnie to zrobi za Ciebie kompilator. Zamiast tego lepiej napisać czytelny kod, który ma ładną abstrakcję ;)

0

@fasadin
Troszeczkę wymijająco odpowiedziałeś na moje pytanie. Aż tak grzebać nie chcę, żeby sie w kompilator bawić jednak zastanawia mnie do jakich celów (poza tymi, które wymieniłem) można jeszcze używać wskaźników (lub też powinno się).

0

Mogę się mylić ale przechodzenie po tablicy wskaźnikiem jest szybsze niż poprzez index.

1
mvt8 napisał(a):

zastanawia mnie do jakich celów (poza tymi, które wymieniłem) można jeszcze używać wskaźników (lub też powinno się).
Uwierz mi że gdy będziesz rozumiał mechanizm wskaźników i doskonalił umiejętność programowania w c/c++ sam dojdziesz do tego kiedy najlepiej ich używać, a kiedy jest to wręcz niezbędne. Przy tworzeniu różnego rodzaju buforów dynamicznych (stosy, kolejki itd.) są one niezbędne. Gdy zechciałbyś dzielić/zarządzać jakimiś danymi w różnych "częściach" swojego programu (np między klasami) również możesz/musisz użyć do tego wskaźników. Czasem lepiej np. w tablicach czy wysokopoziomowych kontenerach przechowywać wskaźniki do obiektów zamiast same obiekty (zależy to oczywiście od tego co chcesz potem z nimi robić) - będzie to przydatne zwłaszcza wszędzie tam gdzie chciałbyś uniknąć zbędnego kopiowania dużych obiektów. Przy wykorzystywaniu polimorfizmu korzystanie ze wskaźników czy referencji staje się koniecznością. Tak więc jest wiele sytuacji, w których ich zastosowanie jest pomocne bądź konieczne.

0

No tak, ale w wy tylko piszecie o GCC, a ja o tych wskaźnikach odnoszę się do całego C++/C, wyczytałem że największe korzyści z iterowania wskaźnikami są w systemach wbudowanych, gdzie każdy cykl procesora się liczy.

0

@Bumcykowy ale na ten system wbudowany też musisz to czymś skompilować przecież... I zapewne kompilator to i tak zoptymalizuje odpowiednio i nie ma się tym co przejmować. Zresztą w systemach wbudowanych zwykle problemem jest rozmiar pamięci a nie jeden cykl procesora wiecej lub mniej.

1

jak dla mnie jakies takie super optymalizację za pomocą wskaźników nie mają zbytnio sensu. Kompilator i tak wygeneruje taki kod jak mu się będzie podobać. Najważniejsze to czytelność kodu resztę pozostaw kompilatorowi. @Bumcykowy do każdego iterowania po tablicy są używane wskaźniki to ,że nie ma w językach wysokiego poziomu tego nie widać nie znaczy ,że ich nie ma. Wskaźnik = adres pamięci. Wyobraź sobie ,że masz w assemblerze do napisania program który będzie iterował przez jakąś tam tablicę. Najbardziej logicznym rozwiązaniem jest zapisanie sobie początkowego adresu bufora do wskaźnika interpretowanie jakimś tam bajtów przypadających na jeden obiekt a później zwiększanie tego wskaźnika czyli adresu o rozmiar jednego obiektu w tablicy. Jakoś nie wyobrażam sobie jakoś inaczej zrealizować iteracji jakbym pisał w czystym asmie. Moje rozwiązanie jest najprostsze i tak też zrobi raczej kompilator nieważne czy będziemy iterować przez tablice przez index czy przez wskaźnik. Kod będzie podobny jak nie taki sam.

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