Wozu Adressen in Pointer speichern??
-
z.B.
anstattvoid x(char data[1024*1024*1024*1024*10]) { // tue etwas } // in main char my_data[1024*1024*1024*1024*10]; // 10 Terrabyte Daten anlegen x(my_data); // das 1. mal 10 Terrabyte kopiert x(my_data); // das 2. mal 10 Terrabyte kopierteinfach
void x(char *data) { // tue etwas } // in main char my_data[1024*1024*1024*1024*10]; // 10 Terrabyte Daten anlegen x(my_data); // my_data wird nicht kopiert x(my_data); // my_data wird nicht kopiertok, du hättest es auch mit Refferenzen machen können und ok, ist vielleicht etwas übertrieben
, aber das ist eine tolle Sache, die du mit Zeigern machen kannst
-
Reyx schrieb:
Außerdem ist der Datentyp "Pointer auf void" in C++ für die generische Programmierung unentbehrlich!
*räusper* void*? den bedarf sehe ich bei templates eigentlich nicht.
mfg
-
Es ist nur nicht in jedem Fall angebracht, gleich ein Template zu verwenden, wo man mal Daten mit beliebigem Datentyp erwartet. Was ist denn z.B. wenn du in der Funktion static-Variablen hast?
-
Reyx schrieb:
Außerdem ist der Datentyp "Pointer auf void" in C++ für die generische Programmierung unentbehrlich!
Unsinn, in C++ gibts Templates. Du verwechselst das vielleicht mit C.
Reyx schrieb:
Es ist nur nicht in jedem Fall angebracht, gleich ein Template zu verwenden, wo man mal Daten mit beliebigem Datentyp erwartet. Was ist denn z.B. wenn du in der Funktion static-Variablen hast?
Ja, was ist denn damit?
-
Probier's aus, dann merkst du schnell, das Templates nicht alles sind ...
-
Pointer auf void für die generische Programmierung unentbehrlich?
*sich am Hinterkopf kratze*Pointer auf void brauch man eigentlich nur dann wenn ich nicht die Möglichkeit habe mit Schnittstellen-Klassen zu arbeiten, bzw. ich versuche etwas zu machen, was meine Klassenhierachie nicht hergibt.
In C soll das ab und zu mal vorkommen (wo dort so intensiv Klassen verwendet werden). :p
In C++ ist es eher ein Hinweis darauf, dass da irgendo noch C-Code rumschwirrt oder auf eine schlechte Architektur. Durch das void hebelt man nämlich die Typerkennung des Compilers aus und das sollte bei einer guten Architektur eigentlich NIE notwendig sein.
Abgesehen davon fällt man damit wenigstens beim MS-Compiler kräftig auf die Nase, wenn man versucht einen void * Pointer mit dynamic_cast in irgendwas zu casten.
-
net schrieb:
Reyx schrieb:
Das hat heute aber nur noch bei sehr systemnahen bzw. kritischen Anwendungen und Spielen Relevanz.
...und bei allen programmen die schnell sein sollen/müssen. deswegen sind viele programme, die in sprachen geschrieben wurden, die keine pointer haben, grottenlangsam.
Verstehe ich nicht. Was für Sprachen sollen das denn sein?
-
Erst mal bitte nicht an dieser Stelle über die Sprachen philosophieren!
Eine anwendung von void* fällt mir schon ein vielleicht ist es selbst erklärend:
void WriteBin(void* ptr; size_t size); ... WriteBin(myInt, sizeof(int)); ...um mein Beispiel vorweg zu entkräften

Das kann man natürlich mit ner templateklasse eleganter lösen, aber vor allem wenn man auf seine Codegröße achten muss (das soll vorkommen) ist void* die einzige Möglichkeit.
Die meisten Sachen sind nicht schwarz oder weiß.
-
Java z.B. besitzt keine Pointer. Es ist allerdings ziemlich schwierig zu beurteilen ob das jetzt gut oder schlecht ist.
-
Mathias schrieb:
Java z.B. besitzt keine Pointer. Es ist allerdings ziemlich schwierig zu beurteilen ob das jetzt gut oder schlecht ist.
zynische stimmen würden sagen, daß etwas, das sich wie ein pointer verhält auch ein pointer ist, besonders, wenn es NullPointerExceptions schmeißt. aber so sind wir ja nicht. gucken wir lieber mal, wie es lisp macht, ohne pointer zu haben. oder perl.
-
@volkard : was meinst du genau mit "was, das sich wie ein pointer verhält" ?
-
Er meint, dass Java intern sehr wohl mit Referenzen/Pointern arbeitet, was sehr sinnvoll ist, da ansonsten Objekte ziemlich oft kopiert werden müssten.
-
Das Java mit Referenzen arbeitet weis ich auch, und das intern letztendlich Referenzen auch über Pointer realisiert werden is klar.
Ich habe eher gedacht, dass er auf was bestimmtes anspielt?
-
Pellaeon schrieb:
@volkard : was meinst du genau mit "was, das sich wie ein pointer verhält" ?
es trennt pointervalue von pointee-value. man kann nach der initialisierung es auf was anderes zeigen lassen, aber auch nur dem pointee was zuweisen, je nach gusto. man kann es uninitialisiert lassen und dann mit absturz drauf zugreifen. das sind zeiger für mich. zeigerarithmetik ist nur ein gimmick von c, um sich den aufwand zu sparen, echte arrays in den makroassembler zu machen.
-
Pellaeon schrieb:
Ich habe eher gedacht, dass er auf was bestimmtes anspielt?
ich mach doch keine anspielungen!
als da was von "keine pointer in java" flog, mußte ich nur in erinnerung rufen, daß java sehr wohl pointer hat, das wort referenzen höchstens ausdrückt, daß man sich ein * spart (aber dafür andere probleme kriegt) und das herumreiten auf "wir haben keine pointer" nichts als ein marketingtrick ist.
-
Das mit der "Anspielung" war ja auch nicht negativ gemeint. Hab ich mich vielleicht etwas "verdruckt ausgekehrt"^^
Was du in deinem vorherigen Post geschrieben hast, war das was ich egrn wissen wollte, halt wie du das genauer meinst
-
volkard schrieb:
zynische stimmen würden sagen, daß etwas, das sich wie ein pointer verhält auch ein pointer ist, besonders, wenn es NullPointerExceptions schmeißt. aber so sind wir ja nicht.
Wieso zynisch? Ob ein Ding auf ein anderes zeigt oder darauf verweist ist doch nur Benennungssache.
gucken wir lieber mal, wie es lisp macht, ohne pointer zu haben. oder perl.
Lisp hat genauso "unsichtbare" Pointer wie Java. Perl kenn ich nicht so genau, aber meines Wissens gibt es da einen Referenzzählmechanismus, der ja ohne Referenzen bzw. Zeiger ziemlich nutzlos wäre.
-
Nach reichlichem Überlegen könnte man zu dem Schluss kommen, dass man um Zeiger/Adressen bei dem Übersetzen keiner Programmiersprache drumrumkommt.
Wird schließlich alles in Maschinensprache übersetzt und die nudelt nunmal auf Speicheradressen.
:pIst nur eine Frage wo man bei der Betrachtung anstetz.
-
Schon auf der Ebene der Sprachsemantik.
-
Reyx schrieb:
Probier's aus, dann merkst du schnell, das Templates nicht alles sind ...
Ich kann dir immer noch nicht folgen, werde doch endlich mal konkret. Auf was willst du denn hinaus?
templäd schrieb:
Das kann man natürlich mit ner templateklasse eleganter lösen, aber vor allem wenn man auf seine Codegröße achten muss (das soll vorkommen) ist void* die einzige Möglichkeit.
Nope. Um mal bei deinem Beispiel zu bleiben, das lässt sich auch mit einer Template Funktion machen.
template <class T> void WriteBin(T* ptr; size_t size);Wenn du nun Speicherplatzprobleme hast und die Funktion nur einmal instanzieren willst, dann kannst du natürlich immer mit dem gleichen Typ arbeiten.
WriteBin(reinterpret_cast<char*>(&myInt), sizeof(myInt));Dass man mit Bytegrössen arbeitet, ist bei deiner Funktion ja auch so. Es wird halt nur implizit vorausgesetzt.
Die Vorteile der Template Funktion liegen klar auf der Hand: typsicherer, flexibler und der Caller hat Kontrolle über den Callee und nicht umgekehrt.