Jeszcze raz wskaźniki

Odpowiedz Nowy wątek
2011-08-18 09:44
Wskaźnik
0

Witam,
mam takie pytanie odnosnie obiektów tymczasowych oraz wskaźników:
Mianowicie, które zastosowanie będzie lepsze, czy wychodzi na to samo?

Rozwiązanie 1

 
std::vector<Obiekt> obiekty;
 
Obiekt ob;    (!)
(...) //jakies tworzenie obiektu ob (np wpisywanie zmiennych z XMLa)
obiekty.push_back(ob);

i tu pytanie czy do wektora zostaje wpisany obiekt ob, siedzi sobie tam, a ten pierwszy obiekt oznaczony przeze mnie jako (!) ginie?

Rozwiązanie 2

 
std::vector<Obiekt*> obiekty;
 
Obiekt* ob = new Obiekt()    (!)
(...) //jakies tworzenie obiektu ob (np wpisywanie zmiennych z XMLa)
obiekty.push_back(&ob);

?

Pozostało 580 znaków

2011-08-18 10:03
0
http://www.cplusplus.com/reference/stl/vector/push_back/ napisał(a)

void push_back ( const T& x );
Add element at the end
Adds a new element at the end of the vector, after its current last element. The content of this new element is initialized to a copy of x.

Pogrubiłem dla czytelności. Następnym razem użyj Google.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2011-08-18 10:04

Pozostało 580 znaków

2011-08-18 10:04
0

@1. w wektorze siedzi kopia obiektu. oryginalny obiekt zginie, gdy wypadnie z zasięgu (np. pod koniec bieżącej funkcji)
@2. błąd składni. ob jest typu Obiekt*, a do wektora próbujesz wrzucić wartość typu Obiekt**.

Następnym razem użyj Google.
to może darujmy sobie w ogóle forum, bo „wszystko co można napisać zostało już napisane i można to znaleźć w Google”

edytowany 1x, ostatnio: Azarien, 2011-08-18 10:06
No to może darujmy sobie cplusplus.com? Pytanie "czy do wektora zostaje wpisany obiekt ob, siedzi sobie tam, a ten pierwszy obiekt oznaczony przeze mnie jako (!) ginie?" nadaje się wprost do FAQ i już tam siedzi od dawna. Zresztą nieważne. - Wibowit 2011-08-18 10:38
Nie wszystko zostało (jeszcze) napisane. A to że większość pytań jest wtórna to niestety fakt. - msm 2011-08-18 17:24

Pozostało 580 znaków

2011-08-18 10:06
Wskaźnik
0

Ależ ja to widziałem, czytałem, jednak chcę się upewnić.
Z tego przykładu wiem tyle że za każdym razem wpisywany jest nowy obiekt do vecotra ale mnie chodzi o to czy
jeśli tworzę obiekt tymczasowy w jakiejś funkcji i potrzebuje te obiekty wpisywać do vectora
to lepiej
a) wpisywać po prostu te tworzone obiekty
b) wpisywać wskaźniki do nich

Pozostało 580 znaków

2011-08-18 10:07
Wskaźnik
0

Azarien:

fakt, źle napisałem, ale chodziło mi po prostu o wpisanie wskaźnik na obiekt tymczasowy.
Problem opisany w poście wyżej.

Dzięki za odzew

Pozostało 580 znaków

2011-08-18 10:45
Zjarek
0

Mnie zawsze interesowało to, czy wywołując np. vector_obiektow.push_back(obiekt(dane,do,konstruktora)) nie zostanie to zoptymalizowane. O ile dobrze pamiętam to kompilator ma prawo zoptymalizować obiekt nowy=funkcja_zwracająca_obiekt_przez_wartosc(), nawet jak konstruktor kopiujący ma efekty uboczne.

Dodatkowo zakładam, że przed push_back() pamięć jest zarezerwowana. - Zjarek 2011-08-18 10:48
Ma prawo zoptymalizować. W rzeczywistości kompilatory wycinają wiele niepotrzebnych kopiowań (np przy używaniu operatorów i ich przeciążania). Deus czy tam quetzalcoatl kiedyś się o tym rozpisywali (nie pamiętam który). - Wibowit 2011-08-18 10:55
A jak w przypadku, gdy obiekt opuszcza scope bez żadnych efektów ubocznych po kopiowaniu występującym w funkcji, tworzonej z template'u (dokładnie ten przypadek). Chyba będę musiał to sprawdzić używając g++ -S. - Zjarek 2011-08-18 10:59
Generalnie optymalizacja w kompilatorach czy też w JVM jest wielofazowa. Jeśli w jakiejś tam fazie uda się zrobić inlining funkcji, to w następnej fazie można optymalizować już tą nową postać. Chociaż GCC jest pod tym względem nieco ograniczony w stosunku do JVM, bo nie może przeprowadzić deoptymalizacji (to wymaga rekompilacji kodu w locie), czyli usuwania optymalizacji, które się aktualnie nie sprawdzają. Generalnie trudności z optymalizacją są największe przy funkcjach wirtualnych, przy statycznym polimorfiźmie nadmiarowe operacje które można wyciąć są od razu widoczne. - Wibowit 2011-08-18 11:28

Pozostało 580 znaków

2011-08-19 13:17
0

Zamiast vector<Obiekt *> użyj boost::ptr_vector.

Zalety:

  • może przechowywać obiekty dowolnej klasy (w vector<obiekt> nie)
  • samo zwalnia obiekty

Przykład:
http://www.bnikolic.co.uk/boostqf/pointer_container.html

edytowany 1x, ostatnio: vpiotr, 2011-08-19 16:52

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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