2013-06-13 8 views
9

uczę się o wskaźniki i referencje, i moje pytanie dotyczy this wyjaśnień, w szczególności następujące części:Czy odwołanie tworzy nową lokalizację w pamięci lub alias istniejącej komórki?

To sugeruje, że deklaracja int& ri = i tworzy nową komórkę pamięci, która ma wartość &i i istnieje w nieznanej lokalizacji pamięci.

Aby przetestować tę teorię, napisałem prosty przypadek, to wynik, który jest widoczny poniżej:

enter image description here

jestem zakłopotany faktem, że r i i mają ten sam adres pamięci, co wydaje się sprzeczne z odczytami. Wynik sugeruje, że int& ri = i luźno oznacza "utworzyć alias dla komórki pamięci i i nazwać go r" tak, że oba odnoszą się do dokładnie tej samej komórki.

Czy dokument jest prawidłowy, czy też coś przeoczyłem?

+0

Nie sądzę, że jest to duplikat, pytam, czy odwołanie faktycznie zajmuje komórkę w pamięci, a nie to, czy ten adres można uzyskać. Jest różnica. – jesterII

+1

Pytanie może nie być to samo, ale myślę, że odpowiedzi dotyczą tego. – juanchopanza

Odpowiedz

10

Od r jest nawiązaniem do i, wszystkie operacje na r są przekształcane przez kompilator do operacji na i. . Czyniąc &r, daje adres pamięci i jest w

(Zauważ, że w przeciwieństwie do wskaźników odniesienia mają właściwość nie jest „ponownie odwoływać” po deklarowanym - oni zawsze odwołać samo - więc nie ma sposobu pisać operacje, które działają "na referencji", a nie "na tym, co się nazywa")

+0

Czy byłoby możliwe uzyskanie położenia pamięci 'r'? – jesterII

+9

@jesterII Nie można nawet zadać pytania. Nie ma żadnej gwarancji, że odwołanie ma w ogóle adres, może być zoptymalizowane przez kompilator (w przeciwieństwie do wskaźnika, który musi gdzieś być) – Patashu

2

Dokument mówi: "Zarówno pi, jak i ri zawierają adresy, które wskazują na lokalizację i, ale różnica polega na tym, że pojawienie się między nimi jest odniesienia i wskaźniki, gdy są używane w wyrażeniach. ", co jest prawdą.

Napisałeś "[referencja] luźno oznacza" utwórz alias dla komórki pamięci i i nazwij go r "tak, że oba odnoszą się do dokładnie tej samej komórki", która jest również prawdziwa.

Prawdopodobnie źle zrozumiałeś dokument, masz rację, a także dokument.

0

Myślę, że może ci pomóc this SO post. Cytując odpowiedź podaną tam:

Odwołanie jest niejawnym wskaźnikiem. Zasadniczo można zmienić wartości punktów odniesienia na , ale nie można zmienić odniesienia do punktu na coś innego.

Nie jestem pewien, co masz na myśli przez "komórkę pamięci". Przeglądanie kodu w zespole może pomóc w zrozumieniu semantyki niższego poziomu, która ma miejsce. Ponieważ wydaje się, że korzystasz z systemu Windows, proponuję, jeśli jesteś ciekawy, uruchomić aplikację w ollyDbg.

Moim zdaniem (i mogę być bardzo błędny) jest to, że kompilator traktuje pi jako zmienną wskaźnik, podczas gdy ri jest niezmiennym wskaźnikiem.

+1

Myślę, że w tym przypadku patrząc na złożenie może być mylące: kompilator może wymagać do przechowywania odniesienia w pewnych okolicznościach, a nie w innych. Semantycznie odniesienie to tylko alias, więc nie wymaga przechowywania jako takiego. – juanchopanza

0

r jest niezależnym odnośnikiem (pojęciem) lub po prostu inną nazwą dla i.Jakiekolwiek zmiany w którekolwiek z nich zostaną odzwierciedlone w sobie nawzajem.

7

C++ 11 §8.3.2/4

It is unspecified whether or not a reference requires storage. 

Zgłoszenie przez lwartości odniesienia (T&) tworzenie koncepcyjne alias do istniejącego miejsca pamięci. Kompilator może używać reguły "jak gdyby", aby traktować ją tak, jak chce. Może utworzyć wskaźnik, może po prostu uzyskać bezpośredni dostęp do pamięci, ale nie powinieneś się przejmować, w jaki sposób zostanie on zaimplementowany.

Czytany plik PDF opisuje możliwą implementację odniesień do lwartości, ale w ogólnym przypadku jest błędna. Dobrym modelem umysłu dla odniesień lvalue byłoby nadanie drugiej nazwy tej samej zmiennej, dzięki czemu można uzyskać dostęp do tych samych danych za pośrednictwem kilku różnych nazw (i zakresów).

Ponadto, nie można wziąć adresu lub utworzyć wskaźnika do wartości, ale można utworzyć do niego wartość odniesienia rvalue.

Powiązane problemy