Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: FAQ - Rund um die Programmierung ::  C vs. C++  
Gehen Sie zu Seite Zurück  1, 2
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Shade Of Mine
Moderator

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 17739
Beitrag Shade Of Mine Moderator 17:53:00 07.08.2002   Titel:              Zitieren

wusstest du, dass virtual Funktionen (also eigentlich die vtable) schneller sind als das vergleichbare switch (also eigentlich die Sprungtabelle)?

_________________
A language that doesn't affect the way you think about programming is not worth knowing.
Werbeunterbrechung
HumeSikkins
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.08.2000
Beiträge: 11139
Beitrag HumeSikkins Mitglied 17:58:00 07.08.2002   Titel:              Zitieren

Hallo,
die Frage ist doch, wie Stroustrup die Aussage verstanden wissen will.

In einer perfekten Welt in der alle C++ Compiler toll optimieren und alle Bibliotheken gut geschrieben sind und in der es nur gute C++ Programmierer gibt, die nicht ständig irgendwo ausversehen temporäre Objekte erzeugen (und davon kann es in C++ ganz schnell ganz viele geben) und nicht völlig überflüssige Vererbung einsetzen und klobige Designs fabrizieren, hat C wahrscheinlich wirklich keine Vorteile gegenüber C++. Schließlich gibt es keinen sprachbedingten Performanceunterschied und C++ bietet zusätzlich viel reichhaltigere Sprackkonstrukte und vielmehr Möglichkeiten Fehler bereits zur Compilezeit zu entdecken.

Da die Welt aber nicht perfekt ist und da es schlechte C++ Compiler, schlechte C++ Bibliotheken und schlechte C++ Programmierer gibt und da es gleichzeitig sehr gute C Compiler, sehr gute C Bibliotheken und sehr gute C Programmierer gibt, existieren sicher auch Situationen/Projekte wo C eindeutig im Vorteil ist.

Man sollte sich nur mit beiden Sprachen sehr gut auskennen bevor man eine Entscheidung trifft. Die Sprachauswahl sollte schließlich keine Bauchauswahl sein. Auch wenn das einige hier im Forum anders sehen :)

[ Dieser Beitrag wurde am 07.08.2002 um 17:59 Uhr von HumeSikkins editiert. ]

_________________
Remember Sturgeon's Law:
"Ninety percent of everything is crap."
and now go visit my Homepage ;-)
cLE
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.07.2002
Beiträge: 49
Beitrag cLE Mitglied 18:17:00 07.08.2002   Titel:              Zitieren

Zitat:
wusstest du, dass virtual Funktionen (also eigentlich die vtable) schneller sind als das vergleichbare switch (also eigentlich die Sprungtabelle)?


Jepp:
vtable bedeutet eine Zeigeroperationen (indizieren des this-Zeigers für die entsprechende Funktion der Klasse), bevor die Funktionsadresse bekannt ist.
switch ist einfach nur furchtbar langsam, du könntest auch if - else if ... schreiben. Bei n-cases gibts halt bis zu n Vergleiche wenn man Pech hat. switch sollte möglichst vermieden werden.
volkard
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2000
Beiträge: 24356
Beitrag volkard Moderator 19:50:00 07.08.2002   Titel:              Zitieren

Zitat:
Original erstellt von Shade Of Mine:
wusstest du, dass virtual Funktionen (also eigentlich die vtable) schneller sind als das vergleichbare switch (also eigentlich die Sprungtabelle)?

Ist mir neu.
begründung:
switch ist dazu da, ne Sprongtabelle zu bauen!
Am nehme nur eben als Werte welche, die schön als Arrayindizes passen.
Also
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
enum {HUND,KATZE,MAUS,DELFIN};
...
switch(type)
{
  case HUND: hund(this);break;
  case KATZE: katze(this);break;
  case MAUS: maus(this);break;
  case DELFIN: delfin(this);break;
  default: fehler();
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
enum {HUND,KATZE,MAUS,DELFIN};
...
switch(type)
{
case HUND: hund(this);break;
case KATZE: katze(this);break;
case MAUS: maus(this);break;
case DELFIN: delfin(this);break;
default: fehler();
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
enum {HUND,KATZE,MAUS,DELFIN};
...
switch(type)
{
  case HUND: hund(this);break;
  case KATZE: katze(this);break;
  case MAUS: maus(this);break;
  case DELFIN: delfin(this);break;
  default: fehler();
}

so, hier haben wir erzeugt:
C/C++ Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
if(unsigned(typ)<=3)
   jumpto tabelle[typ];
/*hier ist tab[0]*/hund();goto ende;
/*hier ist tab[1]*/katze();goto ende;
/*hier ist tab[2]*/maus();goto ende;
/*hier ist tab[3]*/delfin();goto ende;
else
   fehler;
ende:
C/C++ Code:
1
2
3
4
5
6
7
8
9
if(unsigned(typ)<=3)
jumpto tabelle[typ];
/*hier ist tab[0]*/hund();goto ende;
/*hier ist tab[1]*/katze();goto ende;
/*hier ist tab[2]*/maus();goto ende;
/*hier ist tab[3]*/delfin();goto ende;
else
fehler;
ende:
C/C++ Code:
1
2
3
4
5
6
7
8
9
if(unsigned(typ)<=3)
   jumpto tabelle[typ];
/*hier ist tab[0]*/hund();goto ende;
/*hier ist tab[1]*/katze();goto ende;
/*hier ist tab[2]*/maus();goto ende;
/*hier ist tab[3]*/delfin();goto ende;
else
   fehler;
ende:

Und siehe da, es hat einen Vergleiche gekostet und einen Tabellezugriff.
Keine if-Orgie.
Auf manchen Compiler kann man den Vergleich noch weghauen (für mutige).
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
enum {HUND,KATZE,MAUS,DELFIN};
...
assert(unsigned(typ)<=DELFIN);
switch(type)
{
  case HUND: hund(this);break;
  case KATZE: katze(this);break;
  case MAUS: maus(this);break;
  case DELFIN: delfin(this);break;
  default: __assume(0);//code can not be reached
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
enum {HUND,KATZE,MAUS,DELFIN};
...
assert(unsigned(typ)<=DELFIN);
switch(type)
{
case HUND: hund(this);break;
case KATZE: katze(this);break;
case MAUS: maus(this);break;
case DELFIN: delfin(this);break;
default: __assume(0);//code can not be reached
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
enum {HUND,KATZE,MAUS,DELFIN};
...
assert(unsigned(typ)<=DELFIN);
switch(type)
{
  case HUND: hund(this);break;
  case KATZE: katze(this);break;
  case MAUS: maus(this);break;
  case DELFIN: delfin(this);break;
  default: __assume(0);//code can not be reached
}

und er macht draus:
C/C++ Code:
jumpto tabelle[typ];
/*hier ist tab[0]*/hund();goto ende;
/*hier ist tab[1]*/katze();goto ende;
/*hier ist tab[2]*/maus();goto ende;
/*hier ist tab[3]*/delfin();goto ende;
ende:
C/C++ Code:
jumpto tabelle[typ];
/*hier ist tab[0]*/hund();goto ende;
/*hier ist tab[1]*/katze();goto ende;
/*hier ist tab[2]*/maus();goto ende;
/*hier ist tab[3]*/delfin();goto ende;
ende:
C/C++ Code:
jumpto tabelle[typ];
/*hier ist tab[0]*/hund();goto ende;
/*hier ist tab[1]*/katze();goto ende;
/*hier ist tab[2]*/maus();goto ende;
/*hier ist tab[3]*/delfin();goto ende;
ende:

Und jetzt kommt das Leckerli: hund(), katze(), maus() und delfin() können inline sein!
Und noch eins: Ich kann mit sizeof(typ) aussuchen, muß nicht immer ein Zeiger sein.
Und noch eins, ich kann mir aussuchen, wo im Objekt typ steht, evtl bei sowas wie
C/C++ Code:
struct Message
{
   int timeToArrive;
   int typ;
};
C/C++ Code:
struct Message
{
int timeToArrive;
int typ;
};
C/C++ Code:
struct Message
{
   int timeToArrive;
   int typ;
};

wo ich die Messages alle in nem heap halten will, kanns ja sein, daß der Zugriff aufs erste Member schneller ist.
Denn
int getTyp(Message* m)
wird zu
return *(int*)m;
statt
return *((int*)m+1);

Ist zwar nicht gerade bedeutend, aber ich halte es für falsch, zu sagen, vptrs seien einfach schneller als switch.

_________________
http://www.venganza.info/
plonk fürs Forum v1.02
volkard
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2000
Beiträge: 24356
Beitrag volkard Moderator 19:58:00 07.08.2002   Titel:              Zitieren

Zitat:
Original erstellt von Shade Of Mine:
Aber gerade bei kleinen Projekten denke ich, dass ich mehr Mehraufwand durch das Objekt Orientierte Design habe, als ich Nutzen daraus ziehe!

Tip:
Dies ist kein gutes C++-Programm:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Quadrat
{
private:
    int i_;
public:
    Quadrat(int i)
        :i_(i)
    {
    }
    void berechne()
    {
        i_*=i_;
    }
    int ergebnis()
    {
        return i_;
    }
};
...
int x;
Quadrat q(x);
q.berechne();
x=q.ergebnis();
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Quadrat
{
private:
int i_;
public:
Quadrat(int i)
:i_(i)
{
}
void berechne()
{
i_*=i_;
}
int ergebnis()
{
return i_;
}
};
...
int x;
Quadrat q(x);
q.berechne();
x=q.ergebnis();
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Quadrat
{
private:
    int i_;
public:
    Quadrat(int i)
        :i_(i)
    {
    }
    void berechne()
    {
        i_*=i_;
    }
    int ergebnis()
    {
        return i_;
    }
};
...
int x;
Quadrat q(x);
q.berechne();
x=q.ergebnis();

Man meide in C++ overengeneering.
C/C++ Code:
int quadrat(int i)
{
  return i*i;//so einfach ist C++
}
C/C++ Code:
int quadrat(int i)
{
return i*i;//so einfach ist C++
}
C/C++ Code:
int quadrat(int i)
{
  return i*i;//so einfach ist C++
}


Zitat:

OK, jetzt kommt sicher das gegenargument: man muss in C++ ja nicht Objekt Orientiert Programmieren. Stimmt! Aber dann sehe ich es eher als C denn als C++ an.

Es gibt mehr an C++ als virtuelle Funktionen. Und feine C-Programme sind meist auch objektorientiert.

Zitat:

Aber generell kann man sagen: C kann nichts was C++ nicht auch kann (logisch, denn C ist ja fast vollstaendig in C++ enthalten)

Ganz wichtiger Punkt. Das impliziert, daß man in C++ stets und jederzeit, sobald eine Lösung unter Verzicht von aufgeblasenen C++-Mitteln, also in C, schneller wäre, es machen kann, wie man es in C machen würde. Ist das nicht total Klasse?
Daher kann ich auch kaum nachvollziehen, wo C++ langsamer sein könnte.
Außer natürlich, weil die <iostream> so fett ist und ein dutzend von kilobytes Code macht. die wolllen geladen werden und fressen in der tat mehr ram als printf. aber naja, theoretisch kann cout schneller sein als printf, weil die typen bekannt sind und deshalb der formastring nicht geparsed werden muß. isses noch nicht, soweit ich feststellen kann.

[ Dieser Beitrag wurde am 07.08.2002 um 20:08 Uhr von volkard editiert. ]

_________________
http://www.venganza.info/
plonk fürs Forum v1.02
Daniel E.
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.07.2001
Beiträge: 4491
Beitrag Daniel E. Mitglied 21:52:00 07.08.2002   Titel:              Zitieren

Zitat:
Original erstellt von volkard:
isses noch nicht, soweit ich feststellen kann.


Teste doch mal mit `std::cout.sync_with_stdio(false)' in der ersten Zeile. Meine Messungen mit der GCC-Reihe zeigte da Vorteile für `std::cout'.

_________________
Zu jedem Problem gibt es eine Lösung, die klar, einfach und falsch ist.
Helium
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.03.2002
Beiträge: 3535
Beitrag Helium Mitglied 17:58:00 09.08.2002   Titel:              Zitieren

Hier wurde der Speicheroverhead angesprochen. Um sowas zu vermeiden kann man Dinge wie einen pool verwenden. Aber malloc hat das selbe problem wie new und ist somit nicht C++-spezifisch.

_________________
Manual memory management is premature optimization.
virtuell Realisticer
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.05.2000
Beiträge: 3460
Beitrag virtuell Realisticer Mitglied 19:41:00 11.08.2002   Titel:              Zitieren

Kann man nicht einen Thread wie "C vs. C++" in die FAQ aufnehmen?

Dann kann man immer, wenn jemand sowas anfaengt auf die FAQ ver-
weisen und erspart sich den Glaubenskrieg!

mfg
v R

_________________
virtuell Realisticer, innen gut, aussen besser
C/C++ Forum :: FAQ - Rund um die Programmierung ::  C vs. C++  
Gehen Sie zu Seite Zurück  1, 2
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum nicht antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.