2013-05-17 8 views
26

Non riesco a capire cosa sia effettivamente la funzione SetInternalFieldCount(). Nella v8 documentation la funzione è descritta come "il numero di campi interni per gli oggetti generati da questo modello". Che è abbastanza auto esplicativo e non illuminante.Che cos'è un conteggio dei campi interno e per cosa viene utilizzato SetInternalFieldCount?

Nel v8 embedder's guide danno questo esempio

point_templ->SetInternalFieldCount(1); 

e dire "Qui il conteggio campo interno è impostato a 1 che significa che l'oggetto ha un campo interno, con un indice di 0, che indica un C++ oggetto."

Ma che cos'è esattamente un campo interno e che cosa significa effettivamente impostare questo valore nel programma?

risposta

23

Funzione SetInternalFieldCount istruisce V8 per allocare memoria interna slot per ogni istanza creata utilizzando il modello. Ciò ti consente di memorizzare qualsiasi tipo di informazione all'interno di tali istanze.

È utile, ad esempio, per memorizzare la connessione tra l'oggetto V8 e l'istanza della classe C++.

void* p; // any pointer 
Local<Object> obj = point_templ->NewInstance(); 
obj->SetInternalField(0, External::New(p));  // 0 means 1-st internal field 

o per puntatore allineato:

obj->SetAlignedPointerInInternalField(0, p);  // 0 means 1-st internal field 

Dopo questo in un'altra parte di un programma è possibile ottenere il puntatore del genere:

v8::Handle<v8::Object> handle; // some object handle 
if (handle->InternalFieldCount() > 0) 
{ 
    void* p = handle->GetAlignedPointerFromInternalField(0); // from 1-st field 
    // ... do something with p, e.g. cast it to wrapped C++ class instance 
} 
+0

Esattamente. Ciò consente ad alcuni dati C++ di collegarsi con l'oggetto in modo che sia disponibile per il modello oggetto quando deve fare cose come cercare o impostare un valore. – xaxxon

+0

In questo caso, quando "obj" è GCed in JavaScript, verrà cancellato anche l'oggetto puntato da "p"? (Avrei dovuto controllare prima il codice sorgente V8). –

-5

Dal v8.h:

/** 
* Sets the number of internal fields for objects generated from 
* this template. 
*/ 
void SetInternalFieldCount(int value); 

Se si dispone di una classe con 5 membri di dati, allora si dovrebbe impostare SetInternalFieldCount a 5.

class MyObject: public node::ObjectWrap { 
public: 
    int i; 
    int j; 
    int n; 
    int z; 
    int w; 
} 
+1

Questa ottenuto bocciata perché in questa situazione, si imposta il conteggio del campo interno su 1 e si aggiunge l'oggetto che contiene tutti e 5 i valori. – xaxxon

Problemi correlati