 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Babak Pourat Guest
|
Posted: Wed Apr 11, 2007 6:45 pm Post subject: Funktion versus Functor |
|
|
Hallo,
Mir ist nicht klar warum im Kontext der STL fast immer(?) Functors statt
Funktionen genutzt werden.
Z. B. "std::greater" könnte zumindest von der Funktionalität genauso als
Funktion implementiert werden:
template<typename T> bool myGreater(const T & left, const T& right){
return (left > right);
}
Was hat denn der Functor für ein Vorteil?
Was ich mir vorstellen kann ist, dass ein Functor inline in eine
algorithmus (z. B. sort) einkomiliert wird, während die Funktion als
Funktionspointer immer wieder angesprungen wird.
Grüsse
Babak |
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Thu Apr 12, 2007 2:09 am Post subject: Re: Funktion versus Functor |
|
|
Babak Pourat <pourat (AT) autronic (DOT) melchers.de> writes:
| Quote: | Mir ist nicht klar warum im Kontext der STL fast immer(?) Functors
statt Funktionen genutzt werden.
Z. B. "std::greater" könnte zumindest von der Funktionalität genauso
als Funktion implementiert werden:
template<typename T> bool myGreater(const T & left, const T& right){
return (left > right);
}
Was hat denn der Functor für ein Vorteil?
Was ich mir vorstellen kann ist, dass ein Functor inline in eine
algorithmus (z. B. sort) einkomiliert wird, während die Funktion als
Funktionspointer immer wieder angesprungen wird.
|
Das war in der Tat zumindest historisch ein Grund, Funktionsobjekte
Funktionszeigern vorzuziehen. Es gab Leute, welche Messungen
durchführten (und Artikel darüber schrieben), welche belegten, dass
vor ca. 10 Jahren die Compiler Algorithmen besser optimierten, wenn
ihnen Funktionsobjekte übergeben wurden.
Ein weiterer Vorteil von Funktionsobjekten ist, dass sie Instanzen von
Klassen sind; und dass diese Klassen nebst operator() noch andere
Members haben können. Z.B. typedefs, die für die
Template-Metaprogrammierung nützlich sind. In der Standardbibliothek
sind die Funktionsklassen alle von einer Spezialisierung von
std::unary_function oder std::binary_function abgeleitet, und diese
Basisklassen deklarieren result_type und entweder argument_type oder
first_argument_type und second_argument_type. |
|
| Back to top |
|
 |
Daniel Albuschat Guest
|
Posted: Thu Apr 12, 2007 4:49 pm Post subject: Re: Funktion versus Functor |
|
|
Babak Pourat schrieb:
| Quote: | Hallo,
Mir ist nicht klar warum im Kontext der STL fast immer(?) Functors statt
Funktionen genutzt werden.
Z. B. "std::greater" könnte zumindest von der Funktionalität genauso als
Funktion implementiert werden:
template<typename T> bool myGreater(const T & left, const T& right){
return (left > right);
}
Was hat denn der Functor für ein Vorteil?
|
Man kann beliebige zusätzliche Daten vor Aufruf des operator()
bereitstellen. Das ist dann sowas wie ein zusätzlicher
Funktionsparameter, der genutzt werden kann.
Beispiel: Ein Funktor für die Sortierung einer Map kann verschiedene
"Modi" haben, in denen er nach verschiedenen Kriterien sortiert. Diesen
Modus kann man im ctor angeben und hat nur eine Klasse, statt mehrere.
Außerdem hat man ctor, cctor und dtor Semantiken, die unter Umständen
nützlich sein können.
| Quote: | Was ich mir vorstellen kann ist, dass ein Functor inline in eine
algorithmus (z. B. sort) einkomiliert wird, während die Funktion als
Funktionspointer immer wieder angesprungen wird.
|
Optimierung ist in diesem Fall nicht das Primärziel, du hast aber
trotzdem recht. Ich schätze, die Optimierung eines Funktors sollte
einfacher sein als die eines Funktionspointers.
MfG,
Daniel |
|
| Back to top |
|
 |
Nicolas Pavlidis Guest
|
Posted: Thu Apr 12, 2007 5:15 pm Post subject: Re: Funktion versus Functor |
|
|
Babak Pourat wrote:
| Quote: | Hallo,
Mir ist nicht klar warum im Kontext der STL fast immer(?) Functors statt
Funktionen genutzt werden.
|
Das hat IMHO einfach mit dem Design der STL zu tun. Es gibt ja
"Basisklassen" std::binray_predicate usw. Di einfach gewisse
Informationen ausgeben, bzw. ausgeben müssen, undnachdem sie sich diese
Architektur ausgedacht haben, ist es ja nur recht und billig die
"Standardprädikate" auch so zu implementieren.
| Quote: | Was ich mir vorstellen kann ist, dass ein Functor inline in eine
algorithmus (z. B. sort) einkomiliert wird, während die Funktion als
Funktionspointer immer wieder angesprungen wird.
|
Ob der "Aufruf" eines Fuktors geinlined wird oder nicht hängt IMHO 1)
davon ab, ob er inline implementiert wurde und 2) ob der Compiler auch
so nett ist das auch zu machen :-)
LG
Nicolas |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Thu Apr 12, 2007 7:11 pm Post subject: Re: Funktion versus Functor |
|
|
On Apr 11, 3:45 pm, Babak Pourat <pou...@autronic.melchers.de> wrote:
| Quote: | Mir ist nicht klar warum im Kontext der STL fast immer(?) Functors statt
Funktionen genutzt werden.
Z. B. "std::greater" könnte zumindest von der Funktionalität genauso als
Funktion implementiert werden:
template<typename T> bool myGreater(const T & left, const T& right){
return (left > right);
}
Was hat denn der Functor für ein Vorteil?
|
Dass er typedef's u.s.w. auch zur Verfügung stellt. Sachen wie
std::greater<X>::argument_type, z.B. Was sehr nützbar ist, wenn
er weiter als Template-Parameter verwendet wird, bei der
Composition, z.B.
Dazu ist sein Verhalten 100% vom Typ bestimmt, und damit immer
dem Compiler bekannt. Wenn ich z.B. std::set mit einem
Funktionszeiger als Vergleichstyp bei std::set spezifiziere,
dann muss ich stets einen Parameter geben, der die Funktion
nennt. Wenn ich aber std::greater benütze, dann ist der Wert des
Objektes dem Compiler vollig egal. (Das hat auch eine bedeutende
Wirkung auf der Performance. Wenn der Compiler das genaue
Verhalten vollig kennt, dann kann er auf Indirektionnen
verzichten.)
| Quote: | Was ich mir vorstellen kann ist, dass ein Functor inline in eine
algorithmus (z. B. sort) einkomiliert wird, während die Funktion als
Funktionspointer immer wieder angesprungen wird.
|
Zum Beispiel. Das man aber es überhaupt nicht nennen braucht,
ist noch ein stärkerer Grund. Vergleich:
bool myIsGreater( int a, int b ) ;
std::set< int, bool(*)( int, int ) >
someSet( myIsGreater ) ;
und:
struct MyIsGreater
{
bool operator( int a, int b ) const ;
} ;
std::set< int, MyIsGreater >
someSet ;
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Andre Poenitz Guest
|
Posted: Fri Apr 13, 2007 1:29 am Post subject: Re: Funktion versus Functor |
|
|
Babak Pourat <pourat (AT) autronic (DOT) melchers.de> wrote:
| Quote: | Hallo,
Mir ist nicht klar warum im Kontext der STL fast immer(?) Functors statt
Funktionen genutzt werden.
Z. B. "std::greater" könnte zumindest von der Funktionalität genauso als
Funktion implementiert werden:
template<typename T> bool myGreater(const T & left, const T& right){
return (left > right);
}
Was hat denn der Functor für ein Vorteil?
|
Das Objekt kann z.B. noch eigene Daten mit sich rumtragen. Mit
Funktionen muesstest Du die dann global Daten o.ae. machen. Ist deutlich
weniger huebsch.
Andre' |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Fri Apr 13, 2007 6:17 pm Post subject: Re: Funktion versus Functor |
|
|
On Apr 12, 1:49 pm, Daniel Albuschat <dan...@happy.viming.de> wrote:
| Quote: | Babak Pourat schrieb:
Mir ist nicht klar warum im Kontext der STL fast immer(?) Functors statt
Funktionen genutzt werden.
Z. B. "std::greater" könnte zumindest von der Funktionalität genauso als
Funktion implementiert werden:
template<typename T> bool myGreater(const T & left, const T& right){
return (left > right);
}
Was hat denn der Functor für ein Vorteil?
Man kann beliebige zusätzliche Daten vor Aufruf des operator()
bereitstellen. Das ist dann sowas wie ein zusätzlicher
Funktionsparameter, der genutzt werden kann.
Beispiel: Ein Funktor für die Sortierung einer Map kann verschiedene
"Modi" haben, in denen er nach verschiedenen Kriterien sortiert. Diesen
Modus kann man im ctor angeben und hat nur eine Klasse, statt mehrere.
|
Das ist eher interessant beim Prädikaten und solchen Dingen. Als
letzer Parameter zu std::find_if, z.B. Bei Containern wie
std::map ist es fast umgekehrt: Compare() tut nur dann, was man
will, wenn Compare ein Funktor ist, nicht aber wenn er ein
Zieger auf Funktion ist. Wenn man es so betrachtet: ein Zeiger
auf Funktion ist ein Funktor, der unbedingt ein explizit
initialisiertes Datenelement braucht. Du muss es, z.B. dem
Constructor des Maps explizit angeben, was nicht der Fall bei
dem meisten Funktoren ist.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Mon Apr 16, 2007 12:42 am Post subject: Re: Funktion versus Functor |
|
|
Thomas Maeder wrote:
| Quote: | Babak Pourat <pourat (AT) autronic (DOT) melchers.de> writes:
Mir ist nicht klar warum im Kontext der STL fast immer(?) Functors
statt Funktionen genutzt werden.
Z. B. "std::greater" könnte zumindest von der Funktionalität genauso
als Funktion implementiert werden:
template<typename T> bool myGreater(const T & left, const T& right){
return (left > right);
}
Was hat denn der Functor für ein Vorteil?
Was ich mir vorstellen kann ist, dass ein Functor inline in eine
algorithmus (z. B. sort) einkomiliert wird, während die Funktion als
Funktionspointer immer wieder angesprungen wird.
Das war in der Tat zumindest historisch ein Grund, Funktionsobjekte
Funktionszeigern vorzuziehen.
|
Und ist es auch heute noch.
| Quote: | Es gab Leute, welche Messungen durchführten (und Artikel darüber
schrieben), welche belegten, dass vor ca. 10 Jahren die Compiler
Algorithmen besser optimierten, wenn ihnen Funktionsobjekte übergeben
wurden.
|
Sie können inlinig betreiben, was beim Aufruf über den Funktionszeiger oft
nicht möglich ist. |
|
| Back to top |
|
 |
Nicolas Pavlidis Guest
|
Posted: Tue Apr 17, 2007 12:07 am Post subject: Re: Funktion versus Functor |
|
|
Rolf Magnus wrote:
| Quote: | Thomas Maeder wrote:
Babak Pourat <pourat (AT) autronic (DOT) melchers.de> writes:
Mir ist nicht klar warum im Kontext der STL fast immer(?) Functors
statt Funktionen genutzt werden.
Z. B. "std::greater" könnte zumindest von der Funktionalität genauso
als Funktion implementiert werden:
template<typename T> bool myGreater(const T & left, const T& right){
return (left > right);
}
Was hat denn der Functor für ein Vorteil?
Was ich mir vorstellen kann ist, dass ein Functor inline in eine
algorithmus (z. B. sort) einkomiliert wird, während die Funktion als
Funktionspointer immer wieder angesprungen wird.
Das war in der Tat zumindest historisch ein Grund, Funktionsobjekte
Funktionszeigern vorzuziehen.
Und ist es auch heute noch.
|
Wie ich schon sagte, es kann ein Vorteil sein, muss aber nicht, ich mein
Funktionsobjekte die über Classtemplates implementiert wurden sind
meistens inline, da manche Compiler das einfach so wollen, aber es
könnte auch Implementationen geben, die nicht mit Classtemplates
arbeiten, und wo auch operator() nicht inline implementiert ist.
Weitsers ist der Compiler AFAIK nicht dazu verpflichtet inlinig wirklich
zu machen, und kann trotzdem einen Funktionsaufruf einsetzen AFAIK,
außer das "Standardverhalten" hast sich geändert und der Compiler ist
mitlerweile nicht mehr dazu verpflichtet.
Es gibt durch aus Funktionsobjekte die mehr als eine Zeile
Implementierung haben, und da kann es IMHO durchaus vorkommen, dass der
Compiler sich das inlinen spart.
| Quote: | Es gab Leute, welche Messungen durchführten (und Artikel darüber
schrieben), welche belegten, dass vor ca. 10 Jahren die Compiler
Algorithmen besser optimierten, wenn ihnen Funktionsobjekte übergeben
wurden.
Sie können inlinig betreiben, was beim Aufruf über den Funktionszeiger oft
nicht möglich ist.
|
Meiner Meiung nach, war das ein schöner Nebeneffekt, IMHO liegt die
Verwendung von Funktionsobjekten einfach daran, wie bereits öfters
erwäht worden ist, dass man mit Funktionsobjekten mehr machen kann als
mit Functionpointers, also typedefs usw.
Ich mein Performance war ihnen AFAIK auch wichtig, aber aoberstes Ziel
der STL und später der Standard Library war und ist es allgemein zu
sein, und Klassen helfen einem da mehr als Funktionen IMHO.
LG
Nicolas |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|