Care este dimensiunea unui pointer? (Programare, C++, Pointeri, Sizeof)

MGZero a intrebat.

Dimensiunea unui pointer este aceeași cu dimensiunea tipului spre care arată sau pointerii au întotdeauna o dimensiune fixă? De exemplu…

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

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

Care ar fi rezultatul acestei operații? Ar fi sizeof(xPtr) ar returna 4 și sizeof(yPtr) ar returna 1, sau cei doi pointeri ar returna de fapt aceeași dimensiune? Motivul pentru care întreb acest lucru este pentru că indicatorii stochează o adresă de memorie și nu valorile adreselor lor respective stocate.

8 răspunsuri
Nathan Monteleone

În general, pointerii au o dimensiune fixă, de ex. pe un executabil pe 32 de biți, de obicei sunt pe 32 de biți. Există câteva excepții, cum ar fi pe vechile ferestre pe 16 biți, când trebuia să faci distincția între pointeri pe 32 de biți și pe 16 biți… De obicei, este destul de sigur să presupunem că aceștia vor fi uniformi în cadrul unui anumit executabil pe sistemele de operare desktop moderne.

Edit: Chiar și așa, aș fi foarte precaut să nu fac această presupunere. în codul dvs.. Dacă aveți de gând să scrieți ceva care trebuie neapărat să aibă un pointer de o anumită dimensiune, ar fi bine să verificați!

Pointerii de funcție sunt o altă poveste – vezi răspunsul lui Jens pentru mai multe informații.

Comentarii

  • @cf16 Se poate, dar răspunsul meu afirmă doar că pentru sistemele de operare desktop moderne, adică Win32/64, Linux… Poți să-mi dai un exemplu de diferență pe unul dintre aceste sisteme? –  > Por Nathan Monteleone.
  • ați menționat dumneavoastră însuși câteva excepții, de exemplu, dar OK – –  > Por 4pie0.
  • @cf16 Nu încerc să te închid 🙂 Cunoașteți vreo excepție pe, să zicem, Windows 7? –  > Por Nathan Monteleone.
  • ce exemplu general, Windows, da, îl cunosc pe acest tip. Mă refer la pointeri apropiați/ îndepărtați –  > Por 4pie0.
  • @4pie0 link-ul pe care l-ai furnizat nu indică faptul că în C, dimensiunile acestor pointeri ar fi diferite. –  > Por iheanyi.
Jens

Punctele de funcție pot avea foarte diferite dimensiuni, de la 4 la 20 de octeți pe o mașină X86, în funcție de compilator. Așadar, răspunsul este NU – dimensiunile pot varia.

Un alt exemplu: să luăm un program 8051, acesta are trei intervale de memorie și, prin urmare, are trei dimensiuni diferite ale pointerilor, de la 8 biți, 16 biți, 24 biți, în funcție de locul în care se află ținta, chiar dacă dimensiunea țintei este întotdeauna aceeași (de exemplu, char).

Comentarii

  • Acest lucru se aplică numai dacă vă uitați la ansamblu. În C++, dimensiunile diferite sunt ascunse vederii dumneavoastră. –  > Por Jay.
  • @Jay: Nu este deloc adevărat. sizeof(p) poate da rezultate diferite pentru diferite tipuri de pointeri. –  > Por Nemo.
  • Îmi pare rău, nu am fost clar și specific. Pe o anumită mașină x86 dimensiunea pointerului nu va varia. Pe o arhitectură sau un compilator diferit, dimensiunea pointerului poate fi diferită. Fiind foarte atent să folosesc definiția strictă a cuvântului „variază”. –  > Por Jay.
  • @Jay Un pointer la o funcție membră își poate schimba dimensiunea atunci când îl distribuie (Punctele la funcțiile membre sunt animale foarte ciudate). –  > Por IInspectable.
  • @Jay Acest lucru nu este specific MSC: Toate compilatoarele C++ care suportă moștenirea multiplă trebuie să ajusteze pointerul obiectului atunci când invocă un pointer de funcție membră și, prin urmare, oferă facilități adecvate pentru a calcula decalajul corect în timpul execuției. Multe compilatoare implementează indicatorii de funcții membre prin structuri care conțin informațiile necesare. Singura excepție pe care o cunosc este Digital Mars: acesta generează un thunk care efectuează ajustarea pointerului obiectului, iar pointerii funcțiilor membre indică în schimb acest cod stub. Acest lucru permite tuturor pointeri să aibă aceeași dimensiune. –  > Por IInspectable.
Peeyush

Pe o mașină pe 32 de biți, dimensiunea pointerului este de 32 de biți ( 4 octeți), în timp ce pe o mașină pe 64 de biți este de 8 octeți. Indiferent de tipul de date spre care arată, ei au dimensiune fixă.

Comentarii

  • Ce se întâmplă cu un executabil de 32 de biți pe o mașină de 64 de biți? –  > Por Ident.
Jay

Pentru a răspunde la cealaltă întrebare. Dimensiunea unui pointer și dimensiunea a ceea ce indică nu sunt legate. O analogie bună este să le considerăm ca adrese poștale. Dimensiunea adresei unei case nu are nicio legătură cu dimensiunea casei.

Comentarii

  • Dar codurile poștale pot avea dimensiuni diferite în zone diferite, Vedeți Sunt toți pointeri de date de aceeași dimensiune. Există o anumită relație în sensul că indicatorii de diferite tipuri pot avea dimensiuni diferite. –  > Por Bo Persson.
  • Dacă vă uitați la CPU, există diferite tipuri de metode de adresare (în funcție de procesor). Cele mai mici codifică adresa în raport cu locul unde se află instrucțiunea în loc să ofere o adresă absolută. Unele sunt relative la un registru al CPU. Acestea sunt puțin mai mari decât primul tip (dacă includeți registrul). Cele mai mari au o adresă absolută. Acestea sunt de obicei cele mai mari, deoarece trebuie să aibă suficienți biți pentru a codifica întregul spațiu de adrese al procesorului. C și C++ vă ascund aceste detalii. Folosiți adrese absolute, iar compilatorul determină cum poate obține ceea ce doriți. –  > Por Jay.
Soumajyoti

Pointeri nu au întotdeauna aceeași dimensiune pe aceeași arhitectură.

Puteți citi mai multe despre conceptul de pointeri „apropiați”, „îndepărtați” și „uriași”, doar ca un exemplu de caz în care dimensiunile pointerilor diferă…

http://en.wikipedia.org/wiki/Intel_Memory_Model#Pointer_sizes

Markus Kuhn

Ele pot fi diferite pe mașinile cu adresabilitate de cuvinte (de exemplu, sistemele Cray PVP).

Majoritatea computerelor de astăzi sunt mașini adresabile pe octeți, unde fiecare adresă se referă la un octet de memorie. Acolo, toți indicatorii de date au de obicei aceeași dimensiune, și anume dimensiunea unei adrese de mașină.

La mașinile cu adrese de tip „word-adressable”, fiecare adresă de mașină se referă în schimb la un cuvânt mai mare decât un octet. La acestea, un pointer (char *) sau (void *) către un octet de memorie trebuie să conțină atât o adresă de cuvânt, cât și un decalaj de octet în cadrul cuvântului adresat.

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

J T

Dimensiunea unui pointer este dimensiunea necesară sistemului dumneavoastră pentru a păstra o adresă de memorie unică (deoarece un pointer păstrează doar adresa la care indică).

Comentarii

  • Cu excepția cazului în care indică lucruri precum un char pe o mașină cu adresă de cuvânt. –  > Por Bo Persson.
Rand McRanderson

Recent am întâlnit un caz în care acest lucru nu era adevărat, plăcile TI C28x pot avea o dimensiune a pointerului == 1, deoarece un octet pentru aceste plăci este de 16 biți, iar dimensiunea pointerului este de 16 biți. Pentru a face lucrurile și mai confuze, acestea au, de asemenea, pointeri îndepărtați care sunt 22-bits. Nu sunt foarte sigur ce ar fi sizeof far pointer.

În general, plăcile DSP pot avea dimensiuni ciudate ale numerelor întregi.

Deci, dimensiunile pointerilor pot fi în continuare ciudate în 2020, dacă vă uitați în locuri ciudate