Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

idontknow

unregistriert

1

11.04.2010, 19:48

Compiler Verhalten bei leerer Funktion/Methode; Klasse

moin!

Ist ziemlich simpel, man könnte meinen der Compiler würde eine Funktion/Methode; Klasse (wie unten) einfach "löschen".

Bin mir da aber unsicher also eher aus neugierde: hier der Beispielcode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void foo(void)
{

};

class foo
{
    void foo(void)  { };
};

class foo
{

};


Wie schauts aus, C++ Freaks angetreten ;D

mfg

2

11.04.2010, 19:54

Ich bin mir nciht sicher, was du meinst?
Im Release werden leere Funktionen, genauso wie Funktionen, die nie aufgerufen werden, mit sicherheit wegoptimiert. Klassen gibt es in dem Sinen im ausführbaren code sowieso ncith mehr, sodnern nur noch ihre funktionen.
Aber der Compielr entfernt dabei ja ncihts aus deinem quellcode, er bringt nur informationen gar ncith erst in den Ausführbaren Code ein.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

11.04.2010, 19:55

meine theorie: ist eine funktion im header definiert kann es sein, dass versucht wird zu inlinen und die funktion wird nicht aufgerufen.
wenn du in der cpp deklarierst wird sie wie eine deklarierte aber nicht definierte funktion aufgerufen.(bei nicht definition->linkerfehler, bei leerer funktion->aufruf)
wird eigentlich während des kompilierens oder erst danach optimiert?

edit: wenn das stimmt was PCShadow schreibt, warum gibt es bei deklarierten aber nicht definierten funktionen einen linkerfehler und keinen kompilerfehler?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

11.04.2010, 20:00

Mehrfachdefinition einer Klasse. Das muss spätestens im Linker einern Fehler geben.
Der Compiler kann unter Umständen nicht feststellen, ob eine Mehrfachdefinition vorliegt.

idontknow

unregistriert

5

11.04.2010, 20:10

Das sind voneinanderunabhöngige beispiele geht ja nur darum was der Compiler aus jedem einzelnen für sich betrachtet macht hat PCShadeo + dot aber schon erklärt danke =)

6

11.04.2010, 20:30

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class foo
{
    void foo(void)  { };
};

class foo
{

};


Das wird als Deklarationen annerkannt (Prototyp).
Erstellt man eine Instanz der Klasse wird ein Standard Konstruktor aufgerufen. Aber mit der Klasse kann man ja eh nichts weiter anfangen, ist also nur gut, wenn man sie in einer Datei bekannt machen will in der sie nur als Deklaration benutzt wird. (Soll sie verwendet werden, muss die entsprechende Header Datei inkludiert werden)

C-/C++-Quelltext

1
2
3
4
void foo(void)
{

};


Der Code wird mitkompiliert und das Programm führt diese Funktion auch aus, aber da sie nichts macht, passiert auch nichts weiter und das Programm wird weiter ausgeführt. D.h. es wird kurz reingesprungen und dann wieder raus. Das sieht man z.B. wenn man nen Breakpoint in die Funktion setzt und den Debugger startet.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

11.04.2010, 20:52

Nein das ist keine Deklaration. Das sind 2 Definitionen und daher verstösst das Programm gegen die ODR (One definition rule). Schlimmer noch die Definitionen sind unterschiedlich, was sogar bei einem template, wo die ODR weniger restriktiv ist einen Fehler ergeben würde.
Und ein korrekter Konstruktor ist das foo dort auch nicht.

Das zweite stimmt so auch nicht. Üblicherweise wird eine solche Funktion wegoptimiert. Im Debug Mode kann es durchaus sein, dass da noch ein unnötiger Aufruf gemacht wird, aber selbst das muss nicht sein.

8

11.04.2010, 20:55

C-/C++-Quelltext

1
2
3
4
void foo(void)
{

};


Der Code wird mitkompiliert und das Programm führt diese Funktion auch aus, aber da sie nichts macht, passiert auch nichts weiter und das Programm wird weiter ausgeführt. D.h. es wird kurz reingesprungen und dann wieder raus. Das sieht man z.B. wenn man nen Breakpoint in die Funktion setzt und den Debugger startet.
Soweit richtig, wenn man im Debugging Modus arbeitet. Bei erhöhter Kompileroptimierung (Release) können auch schonmal Codeteile wegfalle, ersetzt werden (Division durch 2 wird z.b. durch rightshift ersetzt)

9

11.04.2010, 21:01

@drakon: Das sind nur Beispiele, er wollte nicht wissen, was passiert, wenn man die beiden Klassen zusammen kompiliert, sondern was der Compiler macht, wenn einer der 3 Fälle auftaucht. Und foo ist nur ein Platzhalter für jeden x-beliebigen Namen. Das hat dir idontknow aber auch schon gesagt.

Aber stimmt, bei dem ersten hatte ich die Klammern bei der Funktion übersehen. Ansonsten wäre die Funktion eine Deklaration.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

10

11.04.2010, 21:11

@drakon: Das sind nur Beispiele, er wollte nicht wissen, was passiert, wenn man die beiden Klassen zusammen kompiliert, sondern was der Compiler macht, wenn einer der 3 Fälle auftaucht. Und foo ist nur ein Platzhalter für jeden x-beliebigen Namen. Das hat dir idontknow aber auch schon gesagt.

Ja. Das habe ich schon mitgekriegt. Ich wusste allerdings nicht genau, worauf du dich beziehst.

@idontknow
Probier das nächste mal bitte deine Frage besser zu spezifizieren. Es wusste zuerst niemand so richtig, was du meinst.
Dazu gehört auch kompilierbare Beispiele zu bringen, weil man dann eher versteht, was du meinst.
Das das unabhängige Codestücke sind hast du auch nicht geschrieben gehabt.. Alles in allem sehr verwirrend.

Werbeanzeige