C++ Gegenseitige Abhängigkeiten bei Vererbung

T_55

Lieutenant
Registriert
Feb. 2013
Beiträge
638
Hallo,

eine kurze Frage, ich habe ein Struct_A und Struct_B was von Struct_A erbt.
Struct_B nutzt eine Variable von Struct_A.
In Struct_A soll ein Objekt von Struct_B erstellt werden.
Jetzt kommt der Fehler "unknown type name". Wenn ich die Structs tausche wird es natürlich nicht besser, irgendwie logisch aber ich stehe gerade total auf dem Schlauch, wie macht man das normalerweise wenn es so gegenseitige Abhängigkeiten gibt? lg

C++:
struct struct_A
{
   int test;
   void f1()
   {
      struct_B* sb = new struct_B; // "unknown type name"
   }
};

struct struct_B : struct_A
{
   void f2()
   {
      test++;
   }
};
 
Zeile 6: unendliche Rekursion wenn es funktionieren würde. Du müsstest aber B vor A definieren ;)
 
Konkret meinte blöderidiot vermutlich etwa so:
C++:
struct struct_A
{
    int test;
    void f1();
}; /* <- üblicherweise in struct_A.h */

struct struct_B : struct_A
{
    void f2();
}; /* <- üblicherweise in struct_B.h */

void struct_B::f2(){
    test++;
}  /* <- üblicherweise in struct_B.cpp */

void struct_A::f1()
{
    struct_B* sb = new struct_B;
} /* <- üblicherweise in struct_A.cpp */
 
  • Gefällt mir
Reaktionen: T_55
Warum soll in A ein Objekt aus B erstellt werden? Gibt's dafür einen spezifischen Grund?

Wenn möglich, folge der Objekthierarchie. Sonst holst Du Dir alle möglichen Probleme ins Haus, spätestens bei der Wartung.

Denn die Superklasse hat bereits erwartungsgemäß keine Ahnung von dem, was unter ihr los ist. Soll sie auch gar nicht -- wenn man jetzt Unterklassen C, D und E von A erstellen würde, soll dann A um Funktionalität für eine oder mehrere davon erweitert werden (müssen)?

Bei Bedarf das Modell nochmal überdenken.

// Addendum:

  • Der einfachste Weg, das aufzulösen, ist:
  • Eine neue Klasse C erstellen
  • Hier drin alles zusammenfassen, was A und B gemein haben (sollen)
  • Dann A und B von C ableiten

Jetzt kannst Du bedenkenlos von A auf B zugreifen (und umgekehrt), da B nicht mehr von A abhängt.
 
Zuletzt bearbeitet von einem Moderator: (Lösungsansatz hinzugefügt)
  • Gefällt mir
Reaktionen: BeBur und T_55
@ jumpin: danke das funktioniert.
@ RalphS: danke gut zu wissen, ich versuche das mal so umzubauen mit einer neuen Klasse.
 
Interessant, ich habe zwar von CRTP überhaupt keine Ahnung aber beim überfliegen (https://www.grimm-jaud.de/index.php/blog/c-ist-doch-lazy) sieht es danach aus, als geht es um "Bedarfsauswertung". Bezogen darauf geht die Vermutung schon in die richtige Richtung und hat mit meiner folgenden Frage zu tun.
Ich öffne mal kein neuen Thread da es mit dem Bisherigen zu hat/darauf aufbaut.

Das Vorhaben ist am Ende so:
Zur Laufzeit wird anhand von Settings in einer csv entschieden, welche Objekte/dessen Methoden ausgeführt werden sollen. Ich nenne die mal Module. Die Module, die aktiv sein sollen, werden erzeugt und der Zeiger kommt in ein Vector und der Vector wird dann zu Ausführung iteriert. So werden alle Methoden der gewünschten Module ausgeführt. Damit der Vector die Zeiger auf verschiedene Objekte/Methoden schluckt, muss ich wohl mit einem Interface arbeiten. Das Interface mit rein virtueller Funktion wird an die eigentlichen Objekte mit Ihren Methoden vererbt. So der Plan verschiedene Objekte zur Laufzeit je nach csv Input auszuführen.

Das heißt es gibt: (ich benenne die Klassen jetzt mal ganz neu und habe anhand der Hinweise von @RalphS das Design geändert damit es keine gegenseitigen Abhängigkeiten mehr gibt)
  • Klasse "Data" welche die gemeinsamen Daten besitzt, die von allen "Modulen" sowie "Start" gebraucht wird.
  • Klasse "Interface" mit rein virtueller Funktion
  • unterschiedliche Klassen "Module" mit einer vom Interface abgeleiteten Methode. (CSV entscheidet über Aktivierung). Es werden später mal bis zu 50 Module.
  • Klasse "Start" die das Objekt der Klasse Data anlegt und hier testweise die Module erstellt und in ein Vector packt und dann ausführt. Das Ausführen der Module also Iterieren des Vectors wird dann die Hauptbeschäftigung des Programms.
C++:
#include <iostream>
#include <vector>
#include <memory>

struct Data
{
   int      i = 0;
   double   d = 0;
};

struct Interface
{
    virtual void Run(int index) = 0;
    virtual ~Interface() {}
};

struct Modul_01 : Interface, Data
{
    Modul_01(Data* d): data(d) {}
    Data* data;
    void Run(int index)
    {
        data->i += index;
        std::cout << "Modul_01: " << i << std::endl;
    }
};

struct Modul_02 : Interface, Data
{
    Modul_02(Data* d): data(d) {}
    Data* data;
    void Run(int index)
    {
        data->d += 1.234+index;
        std::cout << "Modul_02: " << d << std::endl;
    }
};

struct Start : Data
{
    Data data;
    std::vector<std::unique_ptr<Interface>> vector;
    void start()
    {
        vector.emplace_back(new Modul_01(&data));
        vector.emplace_back(new Modul_02(&data));
        for (auto i = 0; i < vector.size(); i++)
        {
            vector[i]->Run(1);
        }
    }
  
    void weitere_Methoden()
    {
        // ich arbeite auch mit data...
    }
};

int main()
{
    Start start;
    start.start();
    return 0;
}

Jetzt hab ich bei diesem Design noch ein Problem. Mich nervt total, dass ich in den Modulen auf die Daten "Data" überall per Pfeil-oder Punkt-Operator zugreifen muss da man auf das extra Objekt "Data" angewiesen ist. Irgendwie wäre es besser wenn "Data" in allen Modulen sozusagen zum Sichbarkeitsbereich gehört und man sich diese Indirektion sparen könnte. Auch in "Start" wird es noch Methoden geben die mit Data arbeiten wollen. Performance könnte am Ende eine Rolle spielen weil eine wiederholte Ausführung der gewählten Module die Grundlage des Programms ist, da ich Klimadaten durchschleife und auf die von der CSV gewählten Module anwende. Insofern bin ich eigentlich noch nicht ganz zufrieden mit dem Design, da es so noch etwas schwerfällig ist und ich die ganzen Zugriffsoperatoren für Data gern weg hätte.

Verbesserungsvorschläge immer gern :), Grüße
 
Zuletzt bearbeitet:
Das heißt, du willst das i und das d als Member in den Modulen haben? Weshalb du auch von Data erbst?
Dann erb weiterhin von Data, schmeiss den private member data raus und rufe im Construktor den Konstruktor der base class auf. Dann machst du natürlich ne Kopie.

Die Frage ist, warum du das machen willst?

Warum erbst du überall von Data?

Wenn Performanz wichtig ist, ggf. über std::variant nachdenken.


EDIT: Meine Empfehlung wäre eine einfach die Data Vererbung wegzumachen und bei dem data Member bleiben, ggf. zu const& (ggf. reference Wrapper benutzen) oder const* wechseln. Wenn die Daten von extern kommen bleibt dir nichts anderes übrig als diese zu referenzieren oder eben zu kopieren.
Kopieren wäre ne Option (gerne auch ohne Vererbung, einfach das Data Struct als Member), falls diese Statisch (während der Benutzung der Module) sind und nicht zu groß sind. Das müsste man aber benchmarken.
 
Zuletzt bearbeitet:
new Account() schrieb:
Das heißt, du willst das i und das d als Member in den Modulen haben?
Die Instanz von Data existiert ja nur 1x und soll aber in allen Modulen nutzbar sein (und auch in "Start") daher war meine Idee die Instanz von Data in "Start" zu erzeugen und Adresse an alle Module zu übergeben damit die damit arbeiten können.
new Account() schrieb:
Weshalb du auch von Data erbst?
Ich sehe gerade das Erben von Data in den Modulen ist überflüssig da der Objektzeiger für Data auch ohne Erben erzeugbar ist (weil struct Data sich vor den struct Modulen befindet).
new Account() schrieb:
Dann erb weiterhin von Data, schmeiss den private member data raus und rufe im Construktor den Konstruktor der base class auf. Dann machst du natürlich ne Kopie.
Damit bin ich gerade etwas überfordert :)

new Account() schrieb:
Die Frage ist, warum du das machen willst?
Warum erbst du überall von Data?
edit: stimmt ist natürlich überflüssig.
new Account() schrieb:
Wenn Performanz wichtig ist, ggf. über std::variant nachdenken.
danke, schaue ich mir mal an
 
Zuletzt bearbeitet:
T_55 schrieb:
Ähnlich wie oben gesagt da die Variablen in Data nur 1x existieren und für alle Module sowie "Start" verfügbar sein müssen.
Start hat doch schon den Member data und kann daher darauf zugreifen, und die Module auch (per DI). Im Moment erbst du von Data ohne die Vererbung zu nutzen.
T_55 schrieb:
Da bin gerade etwas überfordert.
Da du von Data erbst, hast du die Member von Data in deiner Klasse und kannst die zum "Lagern" deiner Daten verwenden. Ggf. nochmal genauer nachfragen.
T_55 schrieb:
Die Instanz von Data existiert ja nur 1x und soll aber in allen Modulen nutzbar sein (und auch in "Start") daher war meine Idee die Instanz von Data in "Start" zu erzeugen und Adresse an alle Module zu übergeben damit die damit arbeiten können.
Das definitiv der erstbeste Ansatz. sh. meinen Edit oben.
 
Ok klaro das Erben von Data ist in meinem Code natürlich total überflüssig, zumindest für das dort verfolgte Ziel und sorgt für Verwirrung

Wenn die Module das "Data" erben würden dann hätte jedes Modul auch ein eigenes "Data" und das ist nicht gewollt da alle nur auf das eine Data zugreifen sollen. Daher einfach 1x die Instanz in "Starte".
Das wiederum hat aber den Nachteil das ich überall mit Zugriffsoperatoren Punkt/Pfeil auf die Instanz zugreifen muss. Ich überlege vergeblich wie man diese Indirektion weg bekommt...
 
Auf konzeptioneller Ebene -> wie soll es denn anders laufen? bzw. was wäre dein Ziel?
Ergänzung ()

Was du noch in deiner Klasse machen kannst, ist referenzen/ptr auf einzelne Elemente von Data zu speichern. Macht Sinn, wenn du nur eines brauchst, und nicht die Gefahr besteht, dass deine Referenz/Pointer schwimmen geht ;)
Performanzmäßig dürfte sich da aber nichts ändern (Benchmark um sicherzugehen).
 
Zuletzt bearbeitet:
In "Starte" werden später mal viele Millionen Datenpunkte von Temperaturverläufen iteriert wo bei jedem Datenpunkt die Variablen in "Data" auf die aktuellen Werte verändert werden (damit sollen dann u.a. die Module arbeiten). Nach jedem Punkt wird dann die Schleife zum Ausführen der Module ausgeführt. Sozusagen Temperaturschleife + Modulschleife verschachtelt, insofern werden die Module in massiver Weise wiederholt ausgeführt und ich überlege eben ob man nicht den Scope von den Variablen in "Data" den Modulen noch näher bringen kann. Zum einen könnte es performanter werden und zum anderen muss ich im Code nicht überall den Pfeil/Punkt-Operator schreiben.

Meine einzigen Ideen waren nur sowas wie zB den Funktionen die Instanz zu übergeben. Dann hätte ich in den Funktionen die Pfeil/Punkt-Operatoren weg. Aber Nachteil man übergibt auch bei jedem Aufruf immer wieder die Referenz, wäre auch wieder ein kleiner Overhead.

Eine andere Idee wäre wenn die Module ein Teil von "Starte" wären aber ich brauche ja trotzdem die csv gesteuerte Auswahl der Module...

Wäre irgendwie cool wenn eine Instanz einfach den Scope einer anderen Instanz bekommt als wäre es der eigene Scope.

Aber wenn es nicht anders geht dann mache ich es so mit dem extra Objekt/pointer und der Indirektion mit den Pfeil/Punkt-Operatoren.
 
Zuletzt bearbeitet:
So richtig verstehe ich das Vorhaben nicht. Deshalb nur ein paar Anmerkungen / Fragen.
Was stört dich denn an Pointern? Und was stört dich daran, mit dem Pfeiloperator auf eine Membervariable eines referenzierten Objekts zuzugreifen? Es klingt für mich, als befürchtest du da Performanceeinbußen. Das sehe ich weniger. (Pointer sind schnell.)

[...] dann hätte jedes Modul auch ein eigenes "Data" und das ist nicht gewollt da alle nur auf das eine Data zugreifen sollen.
[...] wo bei jedem Datenpunkt die Variablen in "Data" auf die aktuellen Werte verändert werden
Soll denn nun ein gemeinsamer Datensatz verwendet werden oder werden die Daten ohnehin immer überschrieben?
Für einen gemeinsamen Datensatz kannst du i und d (sehr aussagekräftige Namen btw.; zumal du bspw. in deiner for-Schleife in start() i lokal überschreibst) auch einfach static deklarieren und dann eben doch wieder erben. Dann solltest du es dir allerdings ersparen, ein Dataobjekt in deinen Modulklassen anzulegen.

P.S. Es heißt "einen Vektor" im Akkusativ, nich "ein Vektor"
 
simpsonsfan schrieb:
So richtig verstehe ich das Vorhaben nicht. Deshalb nur ein paar Anmerkungen / Fragen.
Was stört dich denn an Pointern? Und was stört dich daran, mit dem Pfeiloperator auf eine Membervariable eines referenzierten Objekts zuzugreifen? Es klingt für mich, als befürchtest du da Performanceeinbußen. Das sehe ich weniger. (Pointer sind schnell.)
Das ist schon richtig, ob es sich negativ auswirkt müsste ich dann natürlich "messen" und vergleichen (wobei ich noch nichts zum vergleichen habe). Aber es ist auch ein bisschen Faulheit da aktuell schon Funktionen ohne diese Operatoren existieren und ich diese noch umschreiben müsste. Mich interessiert auch einfach aus Neugier ob es noch Möglichkeiten ohne diese Operatoren gäbe. Ich vermute aber schon das die Indirektion etwas Einfluss auf die Performance hätte, wie gesagt das müsste man natürlich messen und gucken ob es überhaupt stört.

simpsonsfan schrieb:
Soll denn nun ein gemeinsamer Datensatz verwendet werden oder werden die Daten ohnehin immer überschrieben?
Beides. Die Daten gibt es nur 1x und werden von allen Modulen benutzt. Und die Daten werden bei jedem neuen Datenpunkt verändert. Sozusagen so:
1: neuer Datenpunkt verändert Daten
2: iteriere alle gewählten Module
wiederhole...

simpsonsfan schrieb:
Für einen gemeinsamen Datensatz kannst du i und d (sehr aussagekräftige Namen btw.; zumal du bspw. in deiner for-Schleife in start() i lokal überschreibst) auch einfach static deklarieren und dann eben doch wieder erben. Dann solltest du es dir allerdings ersparen, ein Dataobjekt in deinen Modulklassen anzulegen.

edit: funktioniert jetzt:

C++:
#include <iostream>
#include <vector>
#include <memory>

struct Data
{
   static int      testvariable_int;
   static double   testvariable_double;
};
int Data::testvariable_int = 0;
double Data::testvariable_double = 0;

struct Interface
{
    virtual void Run(int index) = 0; // rein virtuell
    virtual ~Interface() {} // virtual deconstructor
};

struct Modul_01 : Interface, Data
{
    void Run(int index)
    {
        testvariable_int += index;
        std::cout << "Modul_01: " << testvariable_int << std::endl;
    }
};

struct Modul_02 : Interface, Data
{
    void Run(int index)
    {
        testvariable_double += 1.234+index;
        std::cout << "Modul_02: " << testvariable_double << std::endl;
    }
};

struct Start : Data
{
    std::vector<std::unique_ptr<Interface>> vector;
    void start()
    {
        vector.emplace_back(new Modul_01);
        vector.emplace_back(new Modul_02);

        for (auto i = 0; i < vector.size(); i++)
        {
            vector[i]->Run(1);
        }
    }
    void weitere_Methoden()
    {
        // ich arbeite auch mit data...
    }
};

int main()
{
    Start start;
    start.start();
    return 0;
}
Ergänzung ()

Die Variablen könnten im Grunde auch im "Struct Start" stehen, ich hatte das zuvor nur in die Klasse Data gesteckt damit man es übegeben kann.
Ergänzung ()

Ok der erste Fehler war wegen dem = 0; habe das oben angepasst.
Jetzt bekomme ich bei den Modulen neue Fehler: undefined reference to `Data::testvariable_int'
Ergänzung ()

ok Problem gelöst (https://stackoverflow.com/questions/14331469/undefined-reference-to-static-variable)
Habs oben korrigiert.
Problem ist jetzt das ist wirklich komplett "global" wenn ich jetzt eine weitere Instanz von "Start" erzeuge (zB in einem weiteren Thread) dann kollidieren die Instanzen. Gibt es noch einen Trick wie das so ähnlich funktioniert aber noch innerhalb der "Start" Instanzen bleibt?
 
Zuletzt bearbeitet:
Also angenommen, jeder Thread arbeitet seine start()-methode ab, die auf einem Datensatz arbeiten soll, dann wäre es am sinnvollsten, wie am Anfang gehabt, innerhalb von Start einmal den Datensatz anzulegen und jeder Modulinstanz den zugehörigen Pointer mitzugeben.
Performancetechnisch wird sich übrigens mMn die Nutzung von virtuellen Funktionen oder auch schon von vector deutlich stärker auswirken als die eigenhändige Nutzung von Pointern (Indirektion). C++ muss die ganze Klassenfunktionalität ja unter der Haube ebenso implementieren.
neuer Datenpunkt verändert Daten
Was heißt verändert? Setzt der neue Datenpunkt auf die alten Daten auf oder überschreibt er sie? Falls letzteres könntest du auch einfach mit lokalen Daten arbeiten. Ein int und ein double zu allokieren macht bei deinen Funktionsaufrufen auch nichts mehr aus (performancetechnisch).
 
T_55 schrieb:
Das ist schon richtig, ob es sich negativ auswirkt müsste ich dann natürlich "messen" und vergleichen (wobei ich noch nichts zum vergleichen habe). Aber es ist auch ein bisschen Faulheit da aktuell schon Funktionen ohne diese Operatoren existieren und ich diese noch umschreiben müsste. Mich interessiert auch einfach aus Neugier ob es noch Möglichkeiten ohne diese Operatoren gäbe. Ich vermute aber schon das die Indirektion etwas Einfluss auf die Performance hätte, wie gesagt das müsste man natürlich messen und gucken ob es überhaupt stört.
Also du hast ne Klasse und vermutest, dass es schneller ist, wenn du eine Referenz jedes Mal als Parameter übergibst und dann dereferenzierst, als wenn du eine Referenz im Objekt speicherst und die dann jedes Mal dereferenzierst?
Hab ich das richtig verstanden?
Ergänzung ()

Bzgl. der statischen Variable: ugly
T_55 schrieb:
Gibt es noch einen Trick wie das so ähnlich funktioniert aber noch innerhalb der "Start" Instanzen bleibt?
Du könntest eine statische Variable erstellen mit einem Datenobjekt für jede Start-Instanz. Wenn du das aber nicht inplace machst, bist du garantiert langsamer als wenn du einfach die Referenz injectest.
Ergänzung ()

simpsonsfan schrieb:
Performancetechnisch wird sich übrigens mMn die Nutzung von virtuellen Funktionen oder auch schon von vector deutlich stärker auswirken als die eigenhändige Nutzung von Pointern (Indirektion). C++ muss die ganze Klassenfunktionalität ja unter der Haube ebenso implementieren.
Naja denn das Nachschauen in einer Tabelle wie der vTable wird man nicht vermeiden können mit unterschiedlichen Modulen. Und das sind auch die einzigen Kosten, da C++ & ZeroCost Abstractions ;)
Das einzige was mir einfällt, ist wie gesagt std::variant. Reduziert die Cache Misses deutlich, da alle Module an einem Platz sind.
Ergänzung ()

Was vlt. zielführender wäre, wär ein Threadpool mit Synchronisierung über atomics/CAS...
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: simpsonsfan
simpsonsfan schrieb:
Performancetechnisch wird sich übrigens mMn die Nutzung von virtuellen Funktionen oder auch schon von vector deutlich stärker auswirken als die eigenhändige Nutzung von Pointern (Indirektion). C++ muss die ganze Klassenfunktionalität ja unter der Haube ebenso implementieren.

Was heißt verändert? Setzt der neue Datenpunkt auf die alten Daten auf oder überschreibt er sie? Falls letzteres könntest du auch einfach mit lokalen Daten arbeiten. Ein int und ein double zu allokieren macht bei deinen Funktionsaufrufen auch nichts mehr aus (performancetechnisch).
Das int und double sind nur als Beispiel für Daten da liegt am Ende ein haufen Zeugs auch mit allen möglichen Containern. Verändern tun sich da auch die Dinge ganz unterschiedlich, die Iteration der Tempertaurdaten ist das eine aber auch die Module ändern permanent alles Mögliche, also ist schon gut alles unter einer Haube zu haben und das alle einfach und schnell darauf zugreifen können.


new Account() schrieb:
Also du hast ne Klasse und vermutest, dass es schneller ist, wenn du eine Referenz jedes Mal als Parameter übergibst und dann dereferenzierst, als wenn du eine Referenz im Objekt speicherst und die dann jedes Mal dereferenzierst?
Hab ich das richtig verstanden?
Ne ich denke nur dass der Aufruf einer Variable innerhalb des Scopes schneller ist als der Aufruf über einen Pointer. Wie gesagt das müsste man sowieso vergleichen. Aber daher interessiert mich sozusagen nochmal eine Variante wo die Module scope-mäßig eher an enger den Daten liegen und man nicht ständig und überall mit den Zugriffsoperatoren arbeiten muss.

#------------------

Eine Idee hatte ich noch und zwar die Funktionen der Module einfach alle in die Klasse "Start" zu stecken. Dann könnte man einen vector erstellen der Zeiger auf die zu nutzenden Modulfunktionen aufruft (evt mit std::funktion). Die Modul-eigenen Daten sind weit weniger als die gemeinsamen Daten "Data". Da jedes Modul abgesehen von seiner Funktion eben diese eigene Daten hat, müsste man diese als Objekt noch mit in den Vector packen (bzw den Zeiger). So würde man im vector immer ein Zeiger auf eine Funktion haben sowie ein Zeiger auf dessen Modul-eigene Daten die man beim Funktionsaufruf der Funktion direkt mit übergibt.

Der Vorteil wäre, die gemeinsamen Daten "Data" kann man dann einfach in die Klasse "Start" stecken und alle Funktionen befinden sich im Scope von diesen gemeinsamen Daten. Man hat dann in den Funktionen direkten Zugriff auf die Daten ohne die Zugriffsoperatoren. Eventuell hat das auch Cache-Vorteile da sich die Funktionen und die Daten die am meisten miteinander arbeiten einfach in der gleichen Klasse befinden.
Das Einzige wäre noch wie man die zu den jeweligen Funktionen gehördenden Modul-eigenen Daten als Zeiger in den Vector bekommt. Man hätte keine virtuelle Methoden mehr sondern nur noch die Modul-eigenen Daten.

Ich versuche mal sowas zu bauen, könnte mir aber vorstellen, dass ich Probleme bekomme an der Stelle wo ich die Modul-eigene Daten Klasse beim Funktionsaufruf übergebe. Ich probiere mal...
 
http://wiki.c2.com/?PrematureOptimization schrieb:
In DonaldKnuth's paper "StructuredProgrammingWithGoToStatements", he wrote: "Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%."

Implementier einmal eine funktionierende Lösung. Egal ob effizient oder nicht. Danach kannst du optimieren anfangen.

Gruß
BlackMark
 
  • Gefällt mir
Reaktionen: BeBur, simpsonsfan, kuddlmuddl und eine weitere Person
T_55 schrieb:
Ne ich denke nur dass der Aufruf einer Variable innerhalb des Scopes schneller ist als der Aufruf über einen Pointer. Wie gesagt das müsste man sowieso vergleichen. Aber daher interessiert mich sozusagen nochmal eine Variante wo die Module scope-mäßig eher an enger den Daten liegen und man nicht ständig und überall mit den Zugriffsoperatoren arbeiten muss.
Du hast doch in beiden Fällen Zugriffsoperatoren.
Die Geschindigkeit wird zu einem Großteil dadurch bestimmt wie nah und vorhersehbar deine Daten zusammenliegen -> Cache ftw.
In beiden Fällen musst du einen "Pointer" nutzen, implizit oder nicht. Und zum Geschwindigkeitsunterschied: https://stackoverflow.com/questions/40986606/access-speed-to-static-and-heap-memory

Der Scope einer Klasse hat leider garnichts mit Geschwindigkeit zu tun.

Die Verwendung von std::function machts noch langsamer: https://stackoverflow.com/questions...ction-member-variable-in-terms-of-performance
Ergänzung ()

premature optimization is the root of all evil
Kann ich auch nur noch einmal betonen.
 
Zuletzt bearbeitet:

Ähnliche Themen

Antworten
7
Aufrufe
3.650
R
Antworten
54
Aufrufe
5.211
VikingGe
V
Zurück
Oben