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

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

1

25.08.2009, 16:51

Vererbung und Geschwindigkeit

Hallo

wollte nur kurz mal fragen, ob, wenn man Vererbung ohne virtuelle Methoden benutzt, dann ein Geschwindigkeitsnachteil entsteht...
Also zum Beispiel bei folgendem:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class base
{
public:
  void BaseMethod() { cout << "Hallo"; }
};

class child
  : public base
{
public:
  void ChildMethod() { cout << "Byebye"; }
};

// anstatt


class AllInOne
{
public:
  void BaseMethod() { cout << "Hallo"; }
  void ChildMethod() { cout << "Byebye"; }
};


Eigentlich müsste der Compiler das so hinkriegen, dass da nix anders ist...

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

2

25.08.2009, 16:56

Ohne vtable solltest du eigentlich um den Geschwindigkeitsnachteil rumkommen. Aber ich denke mal das ist Compilerabhängig ...

Abgesehen davon: Vererbung und überschreiben nicht virtueller Methoden ist imho verdammt gefährlich! Den "Performance Nachteil" den man dadurch hat, ist mir bisher nie wirklich in die Quere gekommen.

3

25.08.2009, 17:43

Re: Vererbung und Geschwindigkeit

Zitat von »"Databyte"«

wollte nur kurz mal fragen, ob, wenn man Vererbung ohne virtuelle Methoden benutzt, dann ein Geschwindigkeitsnachteil entsteht...
Wieso sollte ein Geschwindigkeitsnachteil entstehen? Oder was hat das mit virtuellen Funktionen zu tun? Die Methoden werden statisch gebunden und verhalten sich wie ganz normale Funktionen, unabhängig davon, ob sie zur Basisklasse gehören oder nicht. Es entsteht also keine zusätzliche Indirektion, nur weil es sich um Memberfunktionen einer anderen Klasse handelt.

Zitat von »"Das Gurke"«

Abgesehen davon: Vererbung und überschreiben nicht virtueller Methoden ist imho verdammt gefährlich!
Und weshalb?

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

4

25.08.2009, 17:51

Wenn man virtuelle Methoden nutzt, wird in jeder Instance zusätzlich zu den Variablen eine Tabelle mit Pointern angelegt, die dann auf die
jeweils richtigen Methoden zeigen. Und der Zugrif auf diese dauert halt ein bisl länger...

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

5

25.08.2009, 17:59

Dieser Geschwindigkeitsverlust wird aber erst bei sehr großen Klassen mit sehr vielen virtuellen Funktionen (oder bei einem sehr schlechten compiler) messbar sein.
Aber ohne virtuellen Funktionen sollte es keinen Unterschied geben, der größer als die Messungenauigkeit ist.

Zitat von »"Nexus"«

Zitat von »"Das Gurke"«

Abgesehen davon: Vererbung und überschreiben nicht virtueller Methoden ist imho verdammt gefährlich!

Und weshalb?

Weil dann Funktionsaufrufe aus der Basisklasse die Funktionen der Basisklasse aufrufen, und nicht die der abgeleiteten Klasse, was zu schwer findbaren Fehlern, Verwirrung und schlecht wartbarem Code führen kann.
Signaturen werden überbewertet

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

25.08.2009, 18:10

Zitat von »"GR-PA"«


Weil dann Funktionsaufrufe aus der Basisklasse die Funktionen der Basisklasse aufrufen, und nicht die der abgeleiteten Klasse, was zu schwer findbaren Fehlern, Verwirrung und schlecht wartbarem Code führen kann.

Was ist daran schlecht, dass eine Basisklasse seine eigene Funktionen aufruft? - Wenn man Vererbung nutzen möchte, dies aber die Basisklasse von der man ableitet nicht explizit unterstützt, dann ist man selber schuld. Ein wenig mitdenken darf ja erlaubt sein.

Im übrigen sehe ich da oben weder virtuelle Methoden, noch eine Überschreibung.. :roll:

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

Werbeanzeige