<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Funktionsaufruf]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int funktion(int a,int b)
{

	return 3*a+b*6+4;

}

int main()
{

	cout&lt;&lt;funktion (2,5)*2.5;  // hier Funktionsaufruf

}
</code></pre>
<p>hallo was passiert wenn die Funktion im main aufgerufen wird.<br />
obwohl die Funktion ja in derselben Quelldatei liegt, müßte<br />
die Funktion an einer anderen Adresse sein ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270968/funktionsaufruf</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 18:02:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270968.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 21 Jul 2010 09:52:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionsaufruf on Wed, 21 Jul 2010 09:52:42 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int funktion(int a,int b)
{

	return 3*a+b*6+4;

}

int main()
{

	cout&lt;&lt;funktion (2,5)*2.5;  // hier Funktionsaufruf

}
</code></pre>
<p>hallo was passiert wenn die Funktion im main aufgerufen wird.<br />
obwohl die Funktion ja in derselben Quelldatei liegt, müßte<br />
die Funktion an einer anderen Adresse sein ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929487</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Wed, 21 Jul 2010 09:52:42 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsaufruf on Wed, 21 Jul 2010 09:55:55 GMT]]></title><description><![CDATA[<p>Wie das genau funktioniert bleibt dem Compiler/Linker überlassen. Aber ja: Die Funktion liegt natürlich an einer anderen Adresse als main.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929489</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 21 Jul 2010 09:55:55 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsaufruf on Wed, 21 Jul 2010 10:37:25 GMT]]></title><description><![CDATA[<p>blurry333 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int funktion(int a,int b)
{

	return 3*a+b*6+4;

}

int main()
{

	cout&lt;&lt;funktion (2,5)*2.5;  // hier Funktionsaufruf

}
</code></pre>
<p>hallo was passiert wenn die Funktion im main aufgerufen wird.<br />
obwohl die Funktion ja in derselben Quelldatei liegt, müßte<br />
die Funktion an einer anderen Adresse sein ?</p>
</blockquote>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p>That's it.</p>
<p>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.</p>
<p>Ähnliches passiert auch beim Laden einer Shared Library. Hier ist dann auch der Programmlader des BS dafür verantwortlich, die richtigen Adressen zu setzen.</p>
<p>Grundsätzlich gilt aber: Das alles ist Compiler- und Betriebsystemabhängig und für den C/C++-Entwickler nicht von Bedeutung.</p>
<p>mfg Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1929501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1929501</guid><dc:creator><![CDATA[mgaeckler]]></dc:creator><pubDate>Wed, 21 Jul 2010 10:37:25 GMT</pubDate></item></channel></rss>