Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Czym jest zmienna oraz jaki naprawdę ma rozmiar

Ostatnio zmodyfikowano 2017-06-29 03:01
Autor Wiadomość
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
C/C++
Typ A;
A = new A(...);

Dopiero po alokacji możemy na obiekcie działać, tj. wywoływać metody, itd.
Do takiej zmiennej możemy też przypisać wartość null:
C/C++
A = 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)
C/C++
Typ A(...);
// LUB (jesli nie ma konstruktora)
Typ A;

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ę
P-162893
jankowalski25
» 2017-06-28 02:01:10
Czym jest więc zmienna w C++?
» Kurs C++ » Poziom 1Pojęcie zmiennej i podstawowe typy danych lekcja
Czy 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:
C/C++
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.
P-162894
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++.
P-162895
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
P-162897
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.
P-162898
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
?
P-162899
jankowalski25
» 2017-06-28 10:31:29
Zawartość pliku main.cpp:
C/C++
#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/.
P-162902
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.
P-162908
« 1 » 2
  Strona 1 z 2 Następna strona