Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » virtual und inline

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
07.12.2004, 20:13 Uhr
(un)wissender
Niveauwart



C++:

#include <iostream>
#include <string>

template <typename Param>
class Action
{
public:
    Action(bool flag = false) : _enabled(flag) {}
    virtual ~Action() { std::cout << "Action" << std::endl;}
    void setEnabled(bool flag)
    {
        _enabled = flag;
    }
    
    bool isEnabled() const
    {
        return _enabled;
    }
    
    virtual void performAction(const Param& param) = 0;
    
protected:
    bool _enabled;
};

class MyAction
: public Action<std::string>
{
public:
    MyAction() : Action<std::string>() {}
    virtual ~MyAction() { std::cout << "MyAction" << std::endl;}
    virtual void performAction(const std::string& param)
    {
        if(_enabled)
            std::cout << param << std::endl;
        else
            std::cout << "Not available" << std::endl;
    }
};

int main()
{
    MyAction * action = new MyAction;
    action->performAction("Hello Action");
    delete action;
}




Bei diesem Beispielcode könnte performAction gelined werden, da der Typ zu Compilezeit bekannt ist. Weder der g++ 3.4 noch VC 2003 lassen sich dazu überreden. Warum nicht?
Kennt ihr Compiler, die das können?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.12.2004, 21:34 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Ich würde sagen, die Compiler sind bei virtual-Methoden grundsätzlich vorsichtig, was das Inlining angeht... gerade, wenn Du es mit polymorphen Klassen zu tun hast, ist es für den Compiler einfacher, eine interne Tabelle mit den Adressen der Methoden aufzubauen, als zu überprüfen, was jetzt geinlined (ingelined?! Wie eigentlich?) werden kann und was nicht...
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.12.2004, 23:56 Uhr
virtual
Sexiest Bit alive
(Operator)


Meiner Erfahrung nach nutzen Compiler das inline dann, wenn

1. sie nicht implizit (zB virtual Modifier) oder explizit (zB Adressoperator) dieAdresse der Funktion brauchen
2. Die Funktion nicht rekursiv ist
3. Die länge der Routine ein bestimmtes Maß an Code nicht überschreitet

Darüberhinaus gibt es natürlich noch Compiler, die es nie nutzen...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.12.2004, 06:51 Uhr
(un)wissender
Niveauwart


Hm, schade ist diese Compilerverhalten, da diese in obigem Fall, wirklich inline nutzen könnte. Gerade virtual-calls sind teuer und die zu elemenieren sollte wichtig sein. Na ja, vielleicht kommt das noch.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.12.2004, 09:21 Uhr
stephanw
localhorst


@(un)wissender: Spielt das "teuer" bei Dir eine wirkliche Rolle ? Ich mein im Vergleich zu inline klar. Aber in "normalen" Programmen sollte das doch unerheblich sein. Deine zweite Liebe Java ist immer virtual
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.12.2004, 09:37 Uhr
(un)wissender
Niveauwart



Zitat von stephanw:

Deine zweite Liebe Java ist immer virtual



Java ist mir oft zu langsam. Nein, im Ernst: Das stimmt so nicht. final und private sind schon mal nicht virtual und die anderen Funktionen werden oft zur Laufzeit geinlined (dolles Wort), wenn das eigentlich aufzurufende Objekt mit dem Referenztyp übereinstimmt.
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 08.12.2004 um 09:38 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: