Brauchen Funktionen Speicher?
-
Hi,
ich schreibe gerade meine erste echte OOP-Anwendungen (also wo ernsthaft von den Möglichkeiten der Vererbung, usw. Gebrauch gemacht wird - designmäßig bestimmt noch nicht so ideal)
Ich bin jetzt an einem Punkt unsicher, und zwar ob es sinnvoll ist, einer Klasse, von der *sehr* viele Instanzen erstellt werden (sagen wir mal ein paar Millionen), die dementsprechend auch sehr wenige Variablen beinhaltet, alle Funktionen mitzugeben, die man entsprechend seines Designskonzepts für sinnvoll hält, bzw. von einer Klasse abzuleiten, die schon sehr viele Funktionen hat?
Managet das C++ so, dass es für jede Instanz selbstständig die passenden Funktionen heraussucht (bzw. eben auch von den geerbten Funktionen) oder erhalten die alle Pointer?
Denn wenn bei dieser Klasse, die normalerweise nur 20 Byte pro Instanz braucht (von den Variablen her), auf einmal 200 Byte an Zeigern dazu bekommt, dann würde das ein kleines Problem mit den Speicherkapazitäten geben...
rabbit
-
Also die Klassen-Methoden selbst stehen natürlich nur einmal im Speicher, wie eine normale C-Funktion auch. Lädiglich die Klassen-Attribute (Variablen) werden und müssen mehrfach im Speicher vorliegen (außer static-Members).
Klassen brauchen nur noch minmalen zus. Speicher, wenn sie Polymorph sind. Aber im Prinzip gilt: keine Sorgen machen! Das ist alles ausgeklügelt!
class A { int a; // 4 byte void func(); };
Wenn du A 20x instanzierst, werden auch nur 80 bytes im Speicher verbraucht.
Sobald die Klasse aber Polymorph wird, kommen ein paar Bytes dazu... letzteres ist aber denke ich vom jeweiligen Compiler abhängig (wieviel zus. Bytes dazu kommen, meine ich).
-
hi,
thx für die schnelle Antwort
"Aber im Prinzip gilt: keine Sorgen machen! Das ist alles ausgeklügelt!"
Das dachte ich eigentlich auch - aber der Sedgewick schreibt z. B. irgendwo das er keine abstrakten Basisklassen verwendet, weil das einen zusätzlichen Pointerverweis verursacht, denn man bei geschwindigkeitskritischen Algorithmen nicht haben will - Geschwindigkeit wäre jetzt weniger das Problem, aber wie gesagt, der Speicher.
rabbit
-
Pro Klasse kommt ein einziger Pointer dazu (der sog. vptr, der Zeiger auf die Tabelle der virtuellen Funktionen), jedenfalls solange du keine Mehrfachvererbung verwendest.
BTW Sedgewick ist Algorithmen-Guru, kein C++-Experte
-
Nur ein zus. Pointer? OK, für die Polymorphen-Objekte wäre halt der vtab zusätzlich, den ich oben meinte. Wenn es genau nur ein zus. Pointer ist, dann würde ich mir noch weniger Sorgen machen, als ich eh schon nicht gemacht habe.