Funktionsaufruf
-
#include <iostream> using namespace std; int funktion(int a,int b) { return 3*a+b*6+4; } int main() { cout<<funktion (2,5)*2.5; // hier Funktionsaufruf }hallo was passiert wenn die Funktion im main aufgerufen wird.
obwohl die Funktion ja in derselben Quelldatei liegt, müßte
die Funktion an einer anderen Adresse sein ?
-
Wie das genau funktioniert bleibt dem Compiler/Linker überlassen. Aber ja: Die Funktion liegt natürlich an einer anderen Adresse als main.
-
blurry333 schrieb:
#include <iostream> using namespace std; int funktion(int a,int b) { return 3*a+b*6+4; } int main() { cout<<funktion (2,5)*2.5; // hier Funktionsaufruf }hallo was passiert wenn die Funktion im main aufgerufen wird.
obwohl die Funktion ja in derselben Quelldatei liegt, müßte
die Funktion an einer anderen Adresse sein ?Wenn der Compiler diese Quelldatei sieht, erzeugt er für jede Funktion einen eigenen Block in der Objektdatei und für die Startadresse der einzelnen Funktionen einen Eintrag in der Symboltabelle. Die Funktionen liegen in der Objektdatei hinereinander.
Im Startupcode, der mit dem Compiler mitgeliefert wird, befindet sich ein Aufruf von main. Da aber die Adresse noch nicht bekannt ist, befindet sich dort nur eine Referenz auf die Symboltabelle.
Der Linker ist dann das erste Programm, der beides zusammen sieht. Er kennt beim Binden der Anwendung die Adresse von main und sieht auch die Referenz auf die Symboltabelle im Startupcode. Diese Refeenz ersetzt er dann einfach durch die richtige Adresse von main.
That's it.
Bei Betriebssystem, die keinen virtuellen Adressraum unterstützen, sieht es etwas anders aus. Dort befindet sich eine Relokationstabelle und absolute Funktionsaufrufe tun so als ob das Programm an Adresse 0 beginnen würde. In der Relokationstabelle befindet sich nun eine Liste aller Speicherzellen, die angepasst werden müssen. Das macht dann der Programmlader des jeweiligen Betreibssystems.
Ähnliches passiert auch beim Laden einer Shared Library. Hier ist dann auch der Programmlader des BS dafür verantwortlich, die richtigen Adressen zu setzen.
Grundsätzlich gilt aber: Das alles ist Compiler- und Betriebsystemabhängig und für den C/C++-Entwickler nicht von Bedeutung.
mfg Martin