C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Funktion versus Functor

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Babak Pourat
Guest





PostPosted: Wed Apr 11, 2007 6:45 pm    Post subject: Funktion versus Functor Reply with 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?

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





PostPosted: Thu Apr 12, 2007 2:09 am    Post subject: Re: Funktion versus Functor Reply with quote



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





PostPosted: Thu Apr 12, 2007 4:49 pm    Post subject: Re: Funktion versus Functor Reply with quote



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





PostPosted: Thu Apr 12, 2007 5:15 pm    Post subject: Re: Funktion versus Functor Reply with quote

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





PostPosted: Thu Apr 12, 2007 7:11 pm    Post subject: Re: Funktion versus Functor Reply with quote

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





PostPosted: Fri Apr 13, 2007 1:29 am    Post subject: Re: Funktion versus Functor Reply with quote

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





PostPosted: Fri Apr 13, 2007 6:17 pm    Post subject: Re: Funktion versus Functor Reply with quote

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





PostPosted: Mon Apr 16, 2007 12:42 am    Post subject: Re: Funktion versus Functor Reply with quote

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





PostPosted: Tue Apr 17, 2007 12:07 am    Post subject: Re: Funktion versus Functor Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.