Wywołanie funkcji + poboczna dyskusja o referencji
Ostatnio zmodyfikowano 2012-09-25 21:24
cyklopek11 |
» 2012-09-25 20:34:50 Patrząc z punktu widzenia systemu komputerowego 32-bitowego (32-bitowego rejestry ogólnego przeznaczenia procesora a nie system operacyjny) i z poziomu asemblera w trybie chronionym (to co mogą wykorzystać standardowi programiści) "wskaźnik" nie może mieć większego rozmiaru niż 32-bity. Przekładając to na język wysokiego poziomu (np. c/c++ na platformie Windows) tam też wskaźniki nie mogą mieć większego rozmiaru niż 32-bity. Nawet gdyby spróbować zaimplementować klasę która by przechowywała "większy adres" to co programista zrobi z tak dużym adresem powyżej 32-bitów skoro ma do dyspozycji tylko 4GB przestrzeni wirtualnej procesu? (naprawdę 2GB, resztę zżera kernel). Oczywiście taki wskaźnik może pokazywać na dane (pierwszy bajt danych) które mogą mieć i 4GB wielkości. A to, że przed kompilacją w c/c++ "posiada" dodatkową "wiedzę" na co pokazuje nie przeliczałbym na jego wielkość (nigdy nie spotkałem się z tym , żeby ktoś kto programuje w c/c++ oceniał jak wielką "wiedzę" ma wskaźnik ze względu na co pokazuje). Po asemblacji cała jego wiedza ginie (zostaje zaimplementowana w kodzie maszynowym). Z kolei mając platformę z procesorem posiadającym 64-bitowe rejestry ogólnego przeznaczenia to tam wskaźniki mogą mieć co najwyżej 64-bit.
|
|
m4tx |
» 2012-09-25 20:39:20 co programista zrobi z tak dużym adresem powyżej 32-bitów skoro ma do dyspozycji tylko 4GB przestrzeni wirtualnej procesu? |
Niezupełnie. Istnieją sterowniki (or something...) (nie pamiętam już na obecną chwilę, jak się nazywają i nie wiem, czy nie są one też przypadkiem Linux-only), które pozwalają używać więcej niż 4GB RAM-u w systemach 32-bitowych. |
|
ison |
» 2012-09-25 20:44:01 @cyklopek11 owszem ale my mówimy tu o pojęciu wskaźnika w C++, po prostu są takie 'wskaźniki', które mają więcej niż 32 bity pod 32 bitowym systemem w C++, deal with it :) To co mówisz to prawda, adres każdej komórki w pamięci jest opisany przez 32 bity w takim przypadku, ale w przypadku tworu nazywanym wskaźnikami w C++ tak być nie musi. A to, że przed kompilacją w c/c++ "posiada" dodatkową "wiedzę" na co pokazuje nie przeliczałbym na jego wielkość
|
sizeof zwraca faktyczny rozmiar w bajtach w czasie run-time a nie przed kompilacją (nigdy nie spotkałem się z tym , żeby ktoś kto programuje w c/c++ oceniał jak wielką "wiedzę" ma wskaźnik ze względu na co pokazuje)
|
to widocznie mało ludzi spotkałeś :p |
|
Mrovqa |
» 2012-09-25 20:59:55 sizeof zwraca faktyczny rozmiar w bajtach w czasie run-time a nie przed kompilacją |
W czasie kompilacji jest wyliczany i w skompilowanym pliku siedzi jako stała. |
|
cyklopek11 |
» 2012-09-25 21:10:11 ison chyba mówimy o dwóch różnych rzeczach. Pod pojęciem rozmiar wskaźniaka rozumiem wielkość (w bajtach, bitach) liczby całkowitej unsigned (np. unsigned int) określającą adres w wirtualnej przestrzeni adresowej na który to pokazuje. Załóżmy, że stworzysz sobie większy wskaźnik niech będzie: 0xAAAAAAAAA (36-bit). Będąc na platformie 32-bitowej w trybie chronionym mając dostęp do 4GB pamięci wirtualnej i programując w c++ wyjaśnij mi na co będziesz nim pokazywał ???
(Nie włączam tu sterowników i rozszerzonego adresowania) |
|
ison |
» 2012-09-25 21:14:16 @cyklopek11 Nie zrozumieliśmy się, wskaźnik w C++ to nie to samo co wskaźnik na daną konkretną jednostkę w pamięci stąd wskaźniki na metody w C++ niekoniecznie muszą mieć 32 bity. Dlaczego zakładasz, że jeśli wskaźnik w C++ ma więcej niż 32 bity to musi to być koniecznie jedna liczba reprezentująca adres w pamięci jednej konkretnej wartości? |
|
DejaVu |
» 2012-09-25 21:20:24 Czemu dyskutujecie nie na temat? |
|
cyklopek11 |
» 2012-09-25 21:24:58 Fakt, zrobił się mały Off-topic :-) |
|
1 2 « 3 » |