2017-02-23 2 views
1

Von dem, was ich verstehe, enthalten Zeiger die Adressen eines Werts, und Referenzen können als const Zeiger gedacht werden.Wo werden Referenzen und Zeiger erzwungen?

Aus diesem Beispielcode:

int main() { 
    int i = 1; 
    int &ri = i; 
    int *pi = &i; 
    return 0; 
} 

die Demontage, die beiden Zeigern und Referenz genau gleich aussehen:

main: 
    push ebp 
    mov ebp, esp 
    sub esp, 16 
    mov DWORD PTR [ebp-12], 1 
    lea eax, [ebp-12] 
    mov DWORD PTR [ebp-8], eax 
    lea eax, [ebp-12] 
    mov DWORD PTR [ebp-4], eax 
    mov eax, 0 
    leave 
    ret 

sind Zeiger und Verweise nur durch den Compiler erzwungen?

+2

kämpfen, um zu verstehen, was Sie mit "erzwungen" meinen. Sie sind Sprachfeatures und funktionieren wie vorgesehen. –

+1

BTW, das unoptimierte Assembly kontrolliert, ist ein schlechter Weg zu lernen, da Sie nur wirklich über die Implementierungsdetails einer bestimmten Implementierung erfahren. Sie könnten die Tatsache übersehen, dass 'int ri = 1; int & i = ri; 'hätte das gleiche Verhalten. –

Antwort

4

Von dem, was ich verstehe, enthalten Zeiger die Adressen eines Werts, und Referenzen können als const Zeiger gedacht werden.

Das ist eine vereinfachte Ansicht. Der Standard definiert ihr Verhalten. Es ist Aufgabe einer Implementierung, herauszufinden, wie dieses Verhalten unterstützt werden kann.

Bei

int i = 0; 
int& ref = i; 
int* ptr = &i; 

die Standard-Mandate dass

&ref == &i 

und

&ptr != &i; 

Daher kann es sinnvoll sein, von Referenzen als const Zeiger für einige Aspekte seines Verhaltens zu denken aber es macht definitiv keinen Sinn für alle Aspekte seines Verhaltens.

Verwandte Themen