2013-06-26 9 views
6

Ich versuche, meinen Kopf über eine void* und was ist die angemessene Verwendung davon zu wickeln, und wenn es irgendeine potenziell missbräuchliche Verwendung ist, die ich wissen sollte. (Bedeutet etwas Cooles, nicht falsch).Wann void * in C++ zu verwenden

Ich verstehe nicht, wie und warum ein void* verwenden. Wenn ich verstehe, würde ich meinen aktuellen Zeiger auf eine void* werfen und dann zurück zum Original werfen, wenn ich es benutzen wollte ...?

Warum ist das vorteilhaft? Nicht um die Dinge generic, weil ich wissen müssen, welche Art von void* verabschiedet wurde in der Besetzung zu tun ...

Kann mir jemand void*

+0

C++ hat in der Regel bessere Alternativen, und ich weiß, dass es einen bestimmten Betrogenen gibt, an den ich denke. – chris

+3

In C++ niemals 'void *' in * sehr * außergewöhnlichen Umständen erwarten. –

+1

Es ist eines dieser * Features *. Wenn Sie nicht wissen, ob Sie es brauchen, brauchen Sie es nicht. – delnan

Antwort

6

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.

+0

Ich empfehle die Verwendung von 'Uint8_t *' anstelle von 'void *' für die Plattformen, deren minimale adressierbare Einheit 8-Bit ist. Meiner Meinung nach ist das Zeigen auf eine 8-Bit-Einheit besser als ein Zeiger auf nichts. –

1

void* ist eine Speicheradresse ohne einen Typ. Es ist nützlich, wenn der Code in der Umgebung eine andere Möglichkeit hat, zu wissen, mit welchem ​​Typ es arbeitet (z. B. muss memchr die Größe des Speicherbereichs zusätzlich zur Adresse haben).