In C helfen zu verstehen, es ist ziemlich häufig void *
zu verwenden, um zu erstellen eine generische Sammlung. Zum Beispiel, wenn Sie eine generische verknüpfte Liste wollen, könnte man so etwas schreiben:
typedef struct node {
void *data;
struct node *next;
} node;
Dann könnten Sie eine verkettete Liste von foo
, einem anderen verknüpfte Liste von bar
, und so weiter erstellen.
In C++ ist dies jedoch selten nützlich. In einem typischen Fall würden Sie entsprechenden Code als Vorlage schreiben statt:
template <typename T>
class node {
T data;
node *next;
};
Bei älter Compilern Sie den generierten Code durch die Kombination der beiden Techniken reduzieren könnten. In diesem Fall würden Sie eine Sammlung von Zeigern verwenden, um Speicher für ungültig zu erklären die Daten, haben dann eine Vorlage Front-End, das nur T *
behandelt Gießen void *
wenn Sie die Daten gespeichert und wieder void *
-T *
wenn Sie abgerufen die Daten.
Verbesserungen in Compilern/Linkern haben diese Technik (fast?) Völlig veraltet gemacht. Ältere Compiler generieren separaten Code für jeden Typ, für den Sie Ihre Vorlage instanziiert haben, selbst wenn der Instanziierungstyp irrelevant ist. Heutige Compiler (oder Toolchains, das wird vom Linker in der Regel recht gut gehandhabt) identifizieren die identischen Codesequenzen und fügen sie automatisch zusammen.
Fazit: es sei denn, Sie C Kompatibilität benötigen, oder Sie schreiben einen Ersatz operator new
/operator delete
, die Verwendung von void *
in gut geschrieben C++ ist in der Regel ziemlich selten.
C++ hat in der Regel bessere Alternativen, und ich weiß, dass es einen bestimmten Betrogenen gibt, an den ich denke. – chris
In C++ niemals 'void *' in * sehr * außergewöhnlichen Umständen erwarten. –
Es ist eines dieser * Features *. Wenn Sie nicht wissen, ob Sie es brauchen, brauchen Sie es nicht. – delnan