Skocz do zawartości

[c++]wielkość Obiektu (sizeof)


lszk

Rekomendowane odpowiedzi

Stworzyłem sobie prostą klasę, której obiekty tworze poprzez new, oraz normalnie. Kodzik:

#include <iostream>
using namespace std;

class osoba
{
public:
   char nazwisko[40];
   char imie[20];
void dodaj();
void wypisz();
};
void osoba::dodaj()
{
cin >> nazwisko;
cin >> imie;
}
void osoba::wypisz()
{
cout << " nazwisko " << nazwisko << '\n';
cout << " imie " << imie << '\n';
}
int main()
{
osoba *lszk = new osoba();
lszk->dodaj();
lszk->wypisz();
cout << endl << endl;
osoba *lszk2 = new osoba();
lszk2->dodaj();
lszk2->wypisz();
cout << endl << endl;
osoba lszk3;
lszk3.dodaj();
lszk3.wypisz();
cout << endl << endl;
cout << sizeof(lszk) << endl  << sizeof(lszk2) << endl << sizeof(lszk3);
}

No i teraz mam pytanie, dlaczego obiekt tworzony "normanie" zajmuje dużo więcej, niż obiekt tworzony przez wskaźnik. Chciałbym, aby mi to ktoś wyjaśnił. Wiem, że operator new alokuje pamięć, a jak ona jest alokowana w tym ostatnim przykładzie?

Odnośnik do komentarza
Udostępnij na innych stronach

A to rzeczywiście wiele wyjaśnia ;-) Dobrze wiedzieć.

 

Skoro to jest już wyjaśnione, to mam jeszcze jedno pytanie.

 

Dlaczego właściwie powinno się używać tego new? W qt widze, że praktycznie co się da, to się tworzy poprzez te new.

Odnośnik do komentarza
Udostępnij na innych stronach

Ogolnie tworzac obiekt za pomoca new tworzysz obiekt na stercie a nie na stosie. Taki obiekt rzecz jasna powinienes usuwac przed zakonczeniem dzialania programu, tak aby nie bylo wyciekow pamieci. Jednak QT zawiera mechanizmy, ktore zrobia to za Ciebie. Oczywiscie jesli zrobisz to samemu nic nie szkodzi, nawet lepiej bedzie bardziej oczywiste. Zauwaz ze mozesz obiekty tej bibioteki tworzyc dynamicznie jak i statycznie, ale majac do dyspozycji ta pierwsza (z taka a nie inna obsluga) dlaczego z niej nie korzystac. Zawsze lepiej jak zrobisz cos na wskaznikach....

Odnośnik do komentarza
Udostępnij na innych stronach

A to rzeczywiście wiele wyjaśnia ;-) Dobrze wiedzieć.

 

Skoro to jest już wyjaśnione, to mam jeszcze jedno pytanie.

 

Hmm... to dla Ciebie novum? Uczysz sie z jakiejs ksiazki / wykladow etc? Bo przeciez roznica miedzy obiektem, a jego wskaznikiem to absolutne podstawy poruszane w pierwszych rozdzialach wiekszosci ksiazek dot. C++.

 

Dlaczego właściwie powinno się używać tego new? W qt widze, że praktycznie co się da, to się tworzy poprzez te new

 

Glownie - o ile mnie pamiec nie zawodzi - chodzi o wydajnosc (konstruktor kopiujacy itp.), czas zycia obiektow oraz miejsce alokacji pamieci. Zdaje sie, ze mozna tez przeciazyc funkcje new odpowiedzialna za przydzielenie pamieci w konkretnym przypadku. Zapraszam do ksiazek:)

 

Pozdrawiam,

montresol

 

Odnośnik do komentarza
Udostępnij na innych stronach

Coś mi się tam chyba obiło, ale nie można pamiętać wszystkiego ;-)

A moja powyższa reakcja była skierowana do powyższego przykładu.

 

Co do tego new, to się będę musiał zainteresowac.

Odnośnik do komentarza
Udostępnij na innych stronach

Przeładowanie new [void *operator new( type size, user args );] faktycznie daje duże możliwości w porównaniu do m/l-ców z C.

 

Mała errata do jednej z powyższych wypowiedzi - konstruktor kopiujący niewiele tu ma do rzeczy, o ile nie mówimy o nieszczęsnych ret-callach smile.gif

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 weeks later...

Daje nam to bardzo duzo. Przede wszystkim operujac na zmiennych lokalnych nie trzeba alokowac nowych obszarow pamieci, mozna latwo operowac na tablicach,.... i tak moznaby wymieniac jeszcze z pol godziny. Z czasem odpowiedz sama sie nasuwa - dlaczego uzyc wskaznika...

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...