Frage

Es gibt viele Nachteile mit void * in C (Speicher bezogen, Typ bezogen, Effizienz weise ...). Trotz ihnen nutzen wir sie viel für die Flexibilität, die sie bieten.

Führen Sie die Nachteile / Nachteile mit void * (und bevorzugte Lösung in C - wenn möglich)

.

EDIT: Sie gehen durch die follwoing Link: http: / /attractivechaos.wordpress.com/2008/10/02/using-void-in-generic-c-programming-may-be-inefficient/

War es hilfreich?

Lösung

Es gibt keine Effizienzprobleme mit void-Zeiger. Die einzigen Einschränkungen mit void-Zeiger sind:

  • Sie können nicht dereferenzieren void-Zeiger aus offensichtlichen Gründen
  • sizeof(void) ist illegal
  • Sie können nicht Zeiger arithmetics auf void-Zeiger durchführen

Allerdings wird davon ausgegangen, dass GCC sizeof(void) 1 und ermöglicht Zeiger arithmetics auf void-Zeiger - siehe hier

Andere Tipps

Ich bin nicht einverstanden mit der Prämisse der Frage. Wir verwenden void * in C, weil es der einzige Weg ist, Polymorphismus zu bekommen. Beispiel: Bibliotheksfunktionen qsort und bsearch. Es gibt nur einen Nachteil, der das Polymorphismus auf Leere Basis ist * nicht sicher ist: wenn Sie einen Zeiger werfen * ungültig zu erklären, gibt es nichts, das Sie aus Gießen, dass void * auf den falsch Zeigertyp verhindert durch Fehler. Meine Schüler häufig diesen Fehler machen.

Es kann eine Effizienz Kosten, weil es manchmal notwendig ist, Heap-Speicher zuzuordnen, um eine polymorphe Datenstruktur zu verwenden.

Wer die Vorteile und Nachteile bei der Verwendung polymorphe Datenstrukturen mit void * sehen möchte, sollte eine Kopie von Dave Hanson Buch C Schnittstellen und Realisierungen

Uh ... Ich bin nicht sicher, dass es, dass viele sind. Natürlich sollten Sie nie void* verwenden, wenn Sie müssen nicht. Wenn es einen gut definierten Typ ist, können Sie dann tun, verwenden.

Nach meiner Erfahrung ist void* am besten für „anonymous“ Zeiger (was für einen Schock!), Wie in malloc() Rückgabewert, und wenn nur mit undurchsichtigen Puffern von Bits handelt. Oft wollen Sie diese Puffer an z.B. adressieren die Byte-Ebene, und dann würden Sie unsigned char *, natürlich verwenden.

Nur zufällig mit void* wo immer Sie einen Zeiger brauchen nur gebrochen, stinkenden Code würde, und vermieden natürlich werden.

Die verketteten schreiben vergleicht Operationen mit void-Zeiger auf Operationen mit C ++ Vorlagen und kommt zu dem Schluss, dass die Vorlagen effizienter sind. Dies ist kaum eine Überraschung, und der C ++ Code, den ich gesehen habe verwendet void-Zeiger selten oder nie. Es bietet in der Regel keinen Vorteil gegenüber anderen C ++ Einrichtungen und kann eine klaffende Loch in der Art System sein.

Allerdings C nicht über C ++ - Stilvorlagen und void-Zeiger sind notwendige Funktionalität zu implementieren, die vom Datentyp unabhängig zu sein hat.

Wenn Sie also in C schreiben, und Sie müssen Genericity, sind ungültig Zeiger das effizienteste Mittel davon bekommen (da sie das einzige Mittel sind). Wenn Sie in C ++ schreiben, es bessere Möglichkeiten ist fast alles void-Zeiger zu tun erreichen können, so benutzt sie nicht.

Ihre angegebenen Link, ist teilweise wahr. Vor allem, wenn Sie nicht mit Gegenständen (structs) handelt, oder im Allgemeinen mit Typen, die nicht bereits zugeordnet. Mit nativen Typen wie ints, verdoppelt usw. und hohlraum Zeiger (zB für einen Container) ist fast immer eine eklige Angelegenheit, weil Sie entweder die Wahl haben, die int zu werfen (für ein Doppel dies nicht funktioniert) auf einen Zeiger oder Sie müssen für den Datentyp zusätzlichen Speicher zuzuweisen.

Die erste Wahl ist schlecht, weil es nicht tragbar ist, 0s sind vielleicht nicht als Wert erlaubt und es fühlt sich einfach schlecht. Zweite Wahl Abfälle Speicher und ist in der Tat ein (massive) verlangsamen wegen der zusätzlichen Zuweisungen.

Aber in den meisten Fällen nicht mit einheimischen Arten zu tun hat, sondern mit Objekten, besser gesagt mit Zeigern auf Objekte, die bereits zugeordnet sind, zumindest ich. Ich brauchte nie eine Hash-Tabelle oder eine Karte für ganze Zahlen oder Doppelzimmer. Und nur verschiedene Container-Implementierungen mit für Typ Sicherheit von Zeigern fühlt sich falsch an mir, weil jede Implementierung Ihre binäre Größe zunehmen wird. Also, wenn Sie nur einen Behälter benötigen Zeiger zu speichern, gibt es keine Verlangsamung oder Speicher Abfall in mit hohlraum Zeigern.

Beachten Sie aber, das war alles über Container-Implementierungen, wie btw der Blog-Artikel Sie erwähnt. Im Allgemeinen gibt es viele Dinge, die man ohne die Verwendung von hohlraum Zeiger nicht erreichen können.

Ich weiß nicht, habe ich void-Zeiger als ziemlich wirksam für den Zugriff auf verschiedene Abstraktionsebenen (ABCs) gefunden. Als Mittel der auf verschiedenen Abstraktionsebenen miteinander verknüpften Klassen navigieren. Es ist so einfach, seine awesome. Wie die Formel für e oder das goldene Verhältnis, sollte es eine okkulte sein, die die void * sein das große :)

anbetet
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top