latajacaryba Temat założony przez niniejszego użytkownika |
Czym jest zmienna oraz jaki naprawdę ma rozmiar » 2017-06-28 01:51:41 Witam. Zacznę od tego, że w Javie, jeśli chcemy stworzyć obiekt, używamy takiej instrukcji, jak w c++ przy dynamicznej alokacji Dopiero po alokacji możemy na obiekcie działać, tj. wywoływać metody, itd. Do takiej zmiennej możemy też przypisać wartość null: Widać tu dobrze, że zmienne obiektowe w Javie, to coś jak wskaźniki c++ (choć w rzeczywistości są referencją, ale inną niż w naszym ukochanym języku). Do sedna: Czym jest więc zmienna w C++? Oczywiście tworząc obiekt nie używamy new (nie mówie tu o dynamicznej alokacji przy wskaźnikach) Czy jest ona(zmienna w c++) czymś na kształt wskaźnika(na kształt bo nie możemy przypisać null, alokować itp.)? Przecież musi wskazywać na jakieś miejsce w pamięci. I jeszcze sprawa pamięci: Weźmy za przykład int. Wielkość tej zmiennej to 4 bajty. No a co z informacją, pod jakim adresem przechowujemy tę liczbę(liczbę czyli wartość zmiennej)? adres to też liczba, musi być gdzieś przechowana, a to zajmuje miejsce Przepraszam za toporne wyjaśnienie, ale trudno mi to ubrać w słowa. Z góry dziękuję |
|
jankowalski25 |
» 2017-06-28 02:01:10 Czym jest więc zmienna w C++? | Pojęcie zmiennej i podstawowe typy danychCzy jest ona(zmienna w c++) czymś na kształt wskaźnika |
Nie. Wskaźnik jest zmienną przechowującą adres innej zmiennej. na kształt bo nie możemy przypisać null, alokować itp. |
NULL wynosi zero, więc z przypisaniem nie powinno być problemu. Po wejściu w zasięg następuje alokacja, po wyjściu z zasięgu dealokacja. Ręczne zarządzanie stosem jest jak najbardziej możliwe, jednak dobrze byłoby znać cel takiego działania. Przecież musi wskazywać na jakieś miejsce w pamięci. |
Sama zmienna nie musi. Kod, który z niej korzysta, musi wiedzieć, gdzie ona się znajduje. Przykład: const char * tekst = "Ala ma kota"; std::cout << tekst; Zmienna tekst nie musi zawierać informacji o tym, gdzie się znajduje, natomiast wewnątrz operator << musi się znajdować jakaś informacja o tym, skąd brać dane do wypisywania. Weźmy za przykład int. Wielkość tej zmiennej to 4 bajty. |
Nie. Jej rozmiar to sizeof( int ) (który jest typu std::size_t , a nie żaden int czy unsigned int ; jeśli wpiszesz gdzieś w kodzie "luzem wiszące" 4 , to domyślnie typem tej wartości będzie int , ewentualnie w jakimś kontekście może dojść słówko const ). No a co z informacją, pod jakim adresem przechowujemy tę liczbę |
To jest potrzebne tylko w kodzie, który używa danej zmiennej. |
|
pekfos |
» 2017-06-28 02:04:52 Zmienne lokalne są przechowywane na stosie, lub nie. Informacja o adresie zmiennej jest zapisana bezpośrednio w instrukcjach procesora, jako offset względem ramki stosu. Te "lub nie" znaczy, że zmienna nie musi w ogóle istnieć w pamięci. Taki przykładowo int może być przechowywany w rejestrze w ramach optymalizacji i nie musi być potrzeby, by kiedykolwiek to trafiło do pamięci. Większe obiekty już nie za bardzo. Polecam podebugować sobie jakiś program na poziomie instrukcji asma, zamiast C++. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-06-28 02:20:45 Dziękuję za odpowiedzi :)
Nawet nie myślałem, że odpowiedź do pierwszej części pytania będzie znajdowała się w pierwszym temacie (spodziewałem się wymijającego, lakonicznego opisu w stylu "pojemnik na dane").
To w zasadzie wszystko, ale jak już jesteśmy w temacie, to poddam próbie moją małą teorie... Czy fakt, że w Javie zmienne są czymś na kształt wskaźników, jest spowodowany tym, ze twórcom języka zależało na współdzieleniu (2 zmienne mogą wskazywać na jeden, ten sam obiekt)?
PS. Pekfos, skąd tyle wiesz o budowie procesora/zarządzaniu pamięcią? :o |
|
jankowalski25 |
» 2017-06-28 02:38:23 Czy fakt, że w Javie zmienne są czymś na kształt wskaźników, jest spowodowany tym, ze twórcom języka zależało na współdzieleniu (2 zmienne mogą wskazywać na jeden, ten sam obiekt)? |
Cóż, każdy język ma swoje wady i zalety. Niektórzy uznali, że jeśli zamiast obiektów wszystkie zmienne zostaną potraktowane jak wskaźniki, to będzie lepiej - i tak już zostało. Później się okazało, że wcale nie jest tak kolorowo i trzeba używać clone do tworzenia kopii, typy podstawowe zwykle nie są wskaźnikami i trzeba tworzyć dodatkowe obiekty, a błędy związane z nieprawidłowym używaniem zmiennych były, są i będą. skąd tyle wiesz o budowie procesora/zarządzaniu pamięcią? |
Jeśli chodzi o GCC, to zainteresuj się opcją -fdump-tree-all , aby zobaczyć krok po kroku, jak powstaje plik wykonywalny. O zdobywaniu wiedzy już kiedyś wspomniałem - to kwestia czasu, jeśli wiesz, czego chcesz i będziesz dążył do wyznaczonych celów korzystając ze wszystkiego, co wydaje się być sensownym źródłem informacji. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-06-28 03:24:17 A jest do tego (-fdump-tree-all) jakaś dokumentacja? Google wyswietla mi albo raporty błędów albo jakieś opcje dla programistów (3.17 GCC Developer Options) Poza tym, z tego co wyczytałem m.in tu: https://forum.fedora.pl/topic/8941-gcc-a-g/ To gcc to kompilator tylko do C, natomiast g++ do C++. Czy więc na pewno miałeś na myśli GCC pisząc o tym -fdump-tree-all ? |
|
jankowalski25 |
» 2017-06-28 10:31:29 Zawartość pliku main.cpp: #include <iostream>
int main() { const char * hello = "Hello world!\n"; std::cout << hello; } Kompilacja (najprościej, jak się da, Release bez symboli): g++ main.cpp -fdump-tree-all Ewentualnie możesz rzucić okiem na kod asma: objdump -d a.out Kompilacja (tryb Debug, z symbolami): g++ main.cpp -g -fdump-tree-all Teraz porównaj kod asma obu wersji (Debug i Release). Możesz jeszcze dorzucić parę zmiennych, poeksperymentować z optymalizacjami, i tak dalej. Poza tym, są różne narzędzia do badania kodu, na przykład wspomniana już kiedyś strona https://gcc.godbolt.org/. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-06-28 13:52:07 To już chyba wyższa szkoła jazdy, bo nie mam pojęcia czym jest taki operand źródłowy :D Ale jak już będę więcej wiedział, to na pewno zajrzę na tę stronę. Dzięki.
|
|
« 1 » 2 |