2012-10-16 9 views
6

Ho visto riferimenti a 'zone' nello MsgPack C headers, ma non riesco a trovare alcuna documentazione su cosa sia o per cosa sia. Che cos'è? Inoltre, dov'è la documentazione funzione per funzione per l'API C?Che cos'è una 'zona' MsgPack

+0

vi suggerisco di leggere la sua [propria documentazione] (https://github.com/msgpack/msgpack/blob/master/README.md) al primo posto ... –

+0

Mi stai indicando su msgpack.org? In tal caso, non sono stato in grado di trovare nessuna descrizione utile delle zone. Google trova alcuni riferimenti, ma nulla di molto utile: https://www.google.com/search?q=zone+site%3Amsgpack.org&aq=f&sugexp=chrome,mod=10&sourceid=chrome&ie=UTF-8 – brooks94

+0

no. Visita il link, questo è il readme del progetto GitHub. –

risposta

3

msgpack_zone è una struttura interna utilizzata per il ciclo di vita della gestione della memoria & al momento del disimballaggio. Direi che non dovrai mai interagire con esso se utilizzi l'interfaccia standard di alto livello per unpacking o la versione alternativa .

A mia conoscenza, non esiste una documentazione dettagliata: si consiglia invece di fare riferimento alla suite di test che fornisce esempi di codice convenienti per ottenere le attività comuni, ad es. vedi pack_unpack_c.cc e streaming_c.cc.

0

Da quello che potrei raccogliere, è un tipo di solo spostamento che memorizza i dati effettivi di un msgpack::object. Potrebbe benissimo essere inteso come un dettaglio di implementazione, ma a volte si diffonde nel codice degli utenti. Ad esempio, ogni volta che si desidera acquisire uno msgpack::object in una lambda, è necessario acquisire anche l'oggetto msgpack::zone. A volte non è possibile utilizzare lo spostamento dell'acquisizione (ad esempio, in alcuni casi i gestori di asio assumono solo gestori copiabili, oppure il compilatore non supporta la funzione). Per ovviare a questo, è possibile:

msgpack::unpacked r; 
while (pac_.next(&r)) { 
    auto msg = result.get(); 
    io_->post([this, msg, z = std::shared_ptr<msgpack::zone>(r.zone().release())]() { 
       // msg is valid here    
      })); 
}