2011-07-19 15 views
38

Czy rozmiar wskaźnika jest taki sam jak rozmiar wskazanego typu, czy wskaźniki mają zawsze stały rozmiar? Na przykład ...Jaki jest rozmiar wskaźnika?

int x = 10; 
int * xPtr = &x; 
char y = 'a'; 
char * yPtr = &y; 

std::cout << sizeof(x) << "\n"; 
std::cout << sizeof(xPtr) << "\n"; 
std::cout << sizeof(y) << "\n"; 
std::cout << sizeof(yPtr) << "\n"; 

Jaki byłby wynik tego? Czy sizeof(xPtr) powróci 4 i sizeof(yPtr) powrót 1, czy też 2 wskaźniki rzeczywiście zwrócą ten sam rozmiar? Powodem, dla którego o to pytam, jest to, że wskaźniki przechowują adres pamięci, a nie wartości ich zapisanych adresów.

Odpowiedz

55

Wskaźniki mają na ogół ustalony rozmiar, np. na 32-bitowym pliku wykonywalnym zwykle są to 32-bitowe. Istnieje kilka wyjątków, takich jak w starych 16-bitowych oknach, kiedy trzeba było rozróżniać wskaźniki 32-bitowe i 16-bitowe ... Zwykle całkiem bezpiecznie jest założyć, że będą one jednolite w obrębie danego pliku wykonywalnego w nowoczesnych systemach operacyjnych komputera. .

Edycja: Mimo to, zdecydowanie przestałbym robić to przy założeniu w kodzie. Jeśli masz zamiar napisać coś, co absolutnie musi mieć wskaźniki pewnego rozmiaru, lepiej sprawdź to!

Wskaźniki funkcji to już inna historia - więcej informacji można znaleźć w artykule Jens' answer.

+5

nie jest prawdą, nawet na tej samej wielkości wskaźnika maszyna może różnić – 4pie0

+2

@ cf16 mogą, ale moja odpowiedź stwierdza tylko, że dla współczesnych pulpitu systemu operacyjnego, tj Win32/64, Linux ... Czy możesz mi dać jej przykład różni się od jednego z tych systemów? –

+0

wspomniałeś o kilku wyjątkach na przykład, ale OK – 4pie0

10

W przypadku 32-bitowego wskaźnika wielkości maszyny ma 32 bity (4 bajty), podczas gdy na komputerze 64-bitowym ma 8 bajtów. Bez względu na to, jaki typ danych wskazują, mają stały rozmiar.

+1

co jest nie tak? pytanie zostało zadane dla wskaźników typu danych ... – peeyush

+1

Co z 32-bitowym plikiem wykonywalnym na komputerze 64-bitowym? – Ident

0

Wielkość wskaźnikiem jest wielkość wymagana przez system posiadać unikalny adres pamięci (ponieważ wskaźnik tylko przechowuje adres wskazuje na)

+0

Z wyjątkiem sytuacji, gdy wskazuje się na coś takiego, jak znak na adresowanej maszynie. –

54

Wskaźniki funkcyjne mogą mieć bardzo różne rozmiarach, od 4 do 20 bajtów na komputerze X86, w zależności od kompilatora. Tak więc odpowiedź brzmi NIE - rozmiary mogą się różnić.

Kolejny przykład: pobierz program 8051, ma trzy zakresy pamięci i ma trzy różne rozmiary wskaźnika, od 8 bitów, 16 bitów, 24 bitów, w zależności od miejsca docelowego, mimo że rozmiar celu jest zawsze taki sam (np char).

+2

Dziękuję, nawet nie pomyślałem, aby rozważyć wskaźniki Funtion. – MGZero

+1

Dotyczy to tylko osób, które patrzą na zespół. W C++ różne rozmiary są ukryte przed twoim widokiem. – Jay

+2

@Jay: Nieprawda w ogóle. 'sizeof (p)' może dawać różne wyniki dla różnych typów wskaźników. – Nemo

6

Aby odpowiedzieć na inne pytanie. Rozmiar wskaźnika i rozmiar tego, co wskazuje, nie są ze sobą powiązane. Dobrą analogią jest traktowanie ich jako adresów pocztowych. Rozmiar adresu domu nie ma związku z wielkością domu.

+1

Ale kody pocztowe mogą mieć różny rozmiar w różnych obszarach, zobacz [Czy wszystkie wskaźniki danych tego samego rozmiaru] (http://stackoverflow.com/questions/1241205/are-all-data-pointers-of-the-same -size-in-one-platform). Istnieje pewna zależność w tym, że wskaźniki różnych typów mogą mieć różne rozmiary. –

+1

Jeśli spojrzeć na procesor, istnieją różne rodzaje metod adresowania (w zależności od procesora). Najmniejszy koduje adres względem miejsca, w którym instrukcja jest zamiast podania bezwzględnego adresu. Niektóre odnoszą się do rejestru procesora. Są trochę większe niż pierwszy typ (jeśli załączysz rejestr). Największe mają adres bezwzględny. Są one zwykle największe, ponieważ muszą mieć wystarczająco dużo bitów, aby zakodować całą przestrzeń adresową procesora. C i C++ ukrywają te dane przed tobą. Używasz adresów bezwzględnych, a kompilator określa, w jaki sposób może uzyskać to, czego chcesz. – Jay

2

Mogą być różne na maszynach adresowanych do słów (np. systemy Cray PVP).

Większość dzisiejszych komputerów to maszyny adresowane bajtowo, gdzie każdy adres odnosi się do bajtu pamięci. Tam wszystkie wskaźniki danych mają zwykle ten sam rozmiar, a mianowicie rozmiar adresu maszyny.

Na maszynach z adnotacją słowną każdy adres urządzenia odwołuje się do słowa większego niż bajt. Na tych, wskaźnik (char *) lub (void *) do bajtu pamięci musi zawierać zarówno adres słowa, jak i offset bajtowy w dodawanym słowie.

http://docs.cray.com/books/004-2179-001/html-004-2179-001/rvc5mrwh.html

Powiązane problemy