Was bringt der Heap
-
polymorphie? heap? komm da jetzt nicht ganz mit...
Naja, polymorphie geht halt nur mit Zeigern.
Meist erzeugt man polymorphe Objecte in Klassenfabriken, also Objecte, denen man "irgenwie" sagt, was man braucht, und die erzuegen einem ein spezielles Object (per new) geben einem aber nen zeiger auf ne basisklasse zurueck (und haben dann nie wieder was mit dem ding zu tun) .Klar, koennt man die Objecte auch aufn Stack erzeugen, und die Zeiger per adress operator erzeugen ... , aber wenn man sein programm designmaessig in viele module gliedert, wird man kaum nen modul finden, was lange genug lebt, um lieferant fuer so nen zeiger zu sein ... das ueberlebt dann halt nur nen dynamisches Object, also aufn heap ...
Ciao ...
-
RHBaum schrieb:
Naja, polymorphie geht halt nur mit Zeigern.
Mit Referenzen geht es genauso.
Und ich benutze Objekte am Stack durchaus des öfteren Polymorph.
-
Ja, klar ich auch
ich dereferenzier auch zeiger, und geb sie als Referenz weiter, auch polymorph, aber doch eher selten
Ist vielleicnt gaengiges, aber bestimmt nicht das haeufigste vorgehen, und man muss auch wissen was man tut !
Wenn man will kann man alles. Auch dynamisch Speicher anfordern ohne "heap" zu benutzen. Nur die frage nach dem sinn bleibt immer noch ... Und ich denk mal, darum gehts hier auch ned :p Ich glaub unsere Beitraege verwirren ihn nur.Wichtig fuer Manco sind eher die Konsequenzen ...
Am Beispiel fuer nen String
// 1. speicher aufn Stack
char mystring[100];// 2. speicher dynamisch
char * mystring = new char[100];wichtig zu wissen ...
die gemeinsamkeiten:
mystring ist beides mal nen Zeiger. weil, wie wir wissen, eine arrayvariable (1.) immer die addresse des ersten elementes darstellt. also ists sowas wie zeiger, und kann als solcher benutzt werden.
einmal nen speicher angelegt, kann dessen groesse ned veraendert werden. egal ob aufn stack oder aufm heap, willst die groesse aendern, musst das alte wegwerfen. nur bei 1. gehts halt ned auf commando.bei 2. schon und man kann die zeigervariable wiederverwenden (aber ned den speicher)
die unterschiede:
Geschwindigkeit: 1. ist ne menge schneller als 2.
Scope: dein dynamischer Speicher(2) haelt solange bis du es zerstoerst. (delete[] mystring).
Der stack und damit version(1) haelt nur solange, wie der scope ist, also bis den funktionsblock verlaesst, wo das teil drinnen deklariert hast. gehst da raus, wird es zertoert - automatisch (musst dich selbst also nicht kuemmern). Hast noch nen zeiger anderswo drauf und bentuzt ihn danach, fuehrt das meisst zu undefienierten verhalten. Dafuer muesst aber bei der dynamischen version den speicher expliziet wieder freigeben, und darfst den zeiger niemals verbummeln, sonst gibts Memory leaks.
Dynamic:
bei version 1 muss die groesse feststehen, zur Compilezeit ... bei version 2 langts zur laufzeit !size_t isize = 100; char mychar[isize];
size_t isize = 100; char * mychar = new char[isize];
Versuch mal beides zu compilieren ....
Bindung der Variable:
bei 1. wird deine Variable immer auf das vorgegebene Array(speicher) zeigen, ist also konstant, (sprich die Adresse auf die mystring zeigt, wird sich nie anedern = constant) bei 2. kannst den zeiger auch woanders hin zeigen lassen ...size_t isize = 100; char * mychar = new char[isize]; delete[] mychar; mychar = new char[isize * 2];
das geht hingegen ohne probleme ... nur muss man aufpassen, das man keine leaks hinterlaesst.
Du siehst, beides hat Vor und Nachteile, und eigentlich nen unterschiedliches anwednungsgebiet, wobei sich einige bereiche doch an und ab ueberschneiden.
fuer einfachere sachen braucht man meist die Version aufn Stack ... die isst schneller, sicherer (durch automatische speicherfreigabe) ... dafuer viel unflexiebler (keine dynamische groesse)
die version aufn heap braucht man sofort, wenn es um dynamische Groessen geht. Meist wird einem aber gerade das von den Bibliotheken (STL siehe vector map ... etc) abgenommen, wenn man das erste mal auf das Problem stoesst
Als Ubeung kannst ja mal nen programm schreiben, was einen Speicher fuer X elemente reserviert, wobei X vom User anzugeben ist (per Abfrage). Und du darfst dabei keine Zeiger (kein new / delete, kein malloc, free und keine API-Aufrufe, die Speicher anfordern), und keine Containerklassen aus diversen biblotheken verwenden ... auch darfst nicht auf verdacht den maximal moglichen Speicherblock allocieren und nur den benoetigen anteil daraus freizugeben ....
Viel SPass !
Ciao ...
-
Warum man noch Speicherreservierung braucht.
Verwaltet man Datenstrukturen die sehr groß sind kommt man schnell an die Grenze des Stack da viele Kopiler diesen auf 1 MB setzen.
Der Heap ist begrenzt dur den Spiecher welcher sich im Rechner befindet.
Klar kann man den Stack auch erhöhen. Aber warum sollte man dies tun auser wenn man viele Rekursionen oder ähnliches hat, bei denen sich die Standardgröße des Stack auch nicht ausgeht.
In meiner ganzen Zeit als Programmierer > 15 Jahre bin ich eigentlich noch nie soweit gewesen in C++ globale Variablen zu verwenden.
-
Optimizer schrieb:
Echt krass, du gehst ab wie ein Zapferl. Und das ist nicht das erste mal, dass du mich dumm von der Seite anmachst.
Ach nein, wann denn noch? Wenn du so etwas als dumme Anmache verstehst dann tust du mir leid. Den "Bullshit" nehme ich zurück wenn du dich dadurch verletzt gefühlt hast. Aber dein Posting kam so in etwa rüber: "Dynamischen Speicher braucht man nicht wirklich. Wenn nötig kannst du ja auch ein globales Objekt nehmen." Wenn ich dich da absolut falsch interpretiert habe dann entschuldige ich mich hiermit.
-
RHBaum schrieb:
Also ehrlich .... wer programme schreibt, die kaum new oder delete verwenden ... warum nimmt er dann C++ ? Das geht doch mit anderen Programmiersprachen dann genau so gut :p
Kannst du diese Aussage irgendwie erklären? In C++ kann man viele Dinge völlig ohne new und delete lösen, für die man in anderen Sprachen schon den Zeiger-Hammer rausholen müsste.
Und wenn du mit "delete verwenden" meinst, dass in normalem Programmcode "delete" verwendet wird, dann ist die Aussage IMHO noch um einiges fragwürdiger, weil C++ gerade eine der wenigen Sprachen ist, die einem das elegant abnimmt.
-
Kannst du diese Aussage irgendwie erklären?
Was ich meine ist:
wenn man new und delete absichtlich umgeht ... aus irgendwelchen Gruenden, die nicht rein programmiertechnischer Natur sind ... sollt man vielleicht ne Programmiersprache waehlen, die einem da mehr Comfort bietet. "Garbage collections" usw. (ja die verwenden auch HEAP aber der user muss sich damit ned rumschlagen)
Sicher sind die autoptr klassen, string klassen und Container elegant, aber wenn man sich halt mit Zeiger ned beschaeftigen will, fliegt man auch mit denen irgendwann auf die Nase, und zwar kraeftig.Das schoene an C++ ist ja, dass man so "systemnah" ist, und man mit pointer manipulieren kann, auf ganz boese "art".
Wenn wer aber C++ lernt nur um mittels STL container standard operationen auf filestreams und auf standard ein/ausgabe zu schreiben, der "verpasst" viel von der Sprache, der haette es mit ner anderen sprache sicher leichter.
Mit Klassenbiblotheken kommt er dann um zeiger meist nimmer drumherum.
Und mal ehrlich, wieviel % der ernsthaften C++ programme verwenden keine klassenbiblio oder C-API ? "Hallo world" Programme schreib ich in Basic schneller ! ok, uber die Ethik laesst sich da streiten !!!
Wenn aber nen ambitionierter Neueinsteiger mit Pointer ned so klarkommt, sollt man ihm ned sagen, dass er die ja gar ned unbedingt braucht, sondern ihm eher die Angst vor nehmen, und zeigen, was er damit fuer Vorteile gegenueber anderen Programmiersprachen denn hat.
Sonst endet er irgendwo in der Kategorie der CT Redaktuere, die den Artikel ueber den Performance vergleich C++, Pascal, C# Java ... geschrieben haben.Das meint ich damit !
Ciao ...
-
wer viel von der STL nützt verpasst viel von der sprache?
pascal kennt keine zeiger?
ich hoffe c++ hat mehr vorteile außer zeiger gegenüber anderen programmiersprachen
-
MaSTaH schrieb:
Ach nein, wann denn noch? Wenn du so etwas als dumme Anmache verstehst dann tust du mir leid. Den "Bullshit" nehme ich zurück wenn du dich dadurch verletzt gefühlt hast. Aber dein Posting kam so in etwa rüber: "Dynamischen Speicher braucht man nicht wirklich. Wenn nötig kannst du ja auch ein globales Objekt nehmen." Wenn ich dich da absolut falsch interpretiert habe dann entschuldige ich mich hiermit.
Da z.B. noch http://www.c-plusplus.net/forum/viewtopic.php?p=372990&highlight=#372990
Antwort: "Ist ja schon gut. Bin eben mit dem falschen Fuß aufgestanden."
Und ja, du interpretierst meine Aussage immer noch falsch. Lassen wir es lieber... Ich glaube, wir haben beide einigermaßen Ahnung davon, auch wenn wir nicht verstehen, was der Andere meint
*confused*
-
Optimizer schrieb:
Antwort: "Ist ja schon gut. Bin eben mit dem falschen Fuß aufgestanden."
Siehst du? Ich gestehe wenigstens ein wenn ich etwas nicht so nettes sage.
Optimizer schrieb:
Und ja, du interpretierst meine Aussage immer noch falsch.
Anscheinend.
Optimizer schrieb:
Lassen wir es lieber...
Das ist ein Wort.
Optimizer schrieb:
...auch wenn wir nicht verstehen, was der Andere meint
Doch, ich verstehe mittlerweile was du meinst Aber du beharrst ja drauf, dass deine Aussage nicht misszuverstehen war. Das sehe ich halt anderes. Genausogut könnten wir uns jetzt aber auch über das Wetter streiten. Also lassen wir es einfach.
-
-
wer viel von der STL nützt verpasst viel von der sprache?
pascal kennt keine zeiger?Drueck ich mich so unverstaendlich aus ?
Oder seid ihr sooo Kleinkraemer !Naja, das nur hab ich ja nur Fett gemacht, um die Formatierungs Tags hier zu testen !!!
ich hoffe c++ hat mehr vorteile außer zeiger gegenüber anderen programmiersprachen
Ich bin mir sogar sicher. Ich bin mir nur ned sicher, ob das jeder weiss !!!
Ciao ...
-
RHBaum schrieb:
Sonst endet er irgendwo in der Kategorie der CT Redaktuere, die den Artikel ueber den Performance vergleich C++, Pascal, C# Java ... geschrieben haben.
Kann man sich den Artikel irgendwo ansehen? Ich habe die CT nicht, würde mir die Codes auch gerne mal ansehen.
davie schrieb:
pascal kennt keine zeiger?
Such mal nach Zeiger und Pascal hier im Forum. Marc++us hat dazu mal ein Beispiel für Zeiger in Pascal geschrieben, sprich, Pascal hat Zeiger.
Code-Hacker
-
sprich, Pascal hat Zeiger.
Bestreitet das hier wer ? Klar hat Pascal Zeiger ... nur die syntax mit dem ^ ist gewoehnungsbeduerftig
Kann man sich den Artikel irgendwo ansehen?
Muesst zu hause mal die Nummer raussuchen ... ist die vorvorhergehende von der aktuellen ausgabe, glaub ich ....
In der letzten ist auch ne Art Statement zu dem Test ... der ist am ende auch zum schiessen.Aber ich denk mal das ist nen generelles problem grade in C++ auf Libraries und standards gedraengt werden, ohne ueber den Tellerand zu schauen.
Ob man nun ein CObjectArray fuer Performance-tests oder Konstrukte wie std::mapstd::string,std::string nimmt, die Ursache dafuer ist meiner Meinung nach die selbe.Ciao ...