Come posso acquisire la proprietà dei dati di std :: string char senza copiare e senza conservare l'oggetto std :: string source? (Voglio usare semantica commovente ma tra diversi tipi.)Come posso assumere la proprietà di un C++ std :: string char data senza copiare e mantenere l'oggetto std :: string?
Io uso il compilatore C++ 11 Clang e Boost.
Fondamentalmente voglio fare qualcosa di equivalente a questo:
{
std::string s(“Possibly very long user string”);
const char* mine = s.c_str();
// 'mine' will be passed along,
pass(mine);
//Made-up call
s.release_data();
// 's' should not release data, but it should properly destroy itself otherwise.
}
Per chiarire, ho bisogno di sbarazzarsi di std :: string: a valle della strada. Il codice tratta sia di dati stringa che binari e dovrebbe gestirli nello stesso formato. E voglio i dati di std :: string, perché provengono da un altro livello di codice che funziona con std :: string.
Per dare più prospettiva dove cerco di farlo: ad esempio, ho un socket wrapper asincrono che dovrebbe essere in grado di prendere sia i dati std :: string che i dati binari dall'utente per la scrittura. Entrambe le versioni di scrittura "API" (che prendono i dati binari di std :: string o di riga) risolvono internamente la stessa scrittura (binaria). Devo evitare qualsiasi copia poiché la stringa potrebbe essere lunga.
WriteId write(std::unique_ptr<std::string> strToWrite)
{
// Convert std::string data to contiguous byte storage
// that will be further passed along to other
// functions (also with the moving semantics).
// strToWrite.c_str() would be a solution to my problem
// if I could tell strToWrite to simply give up its
// ownership. Is there a way?
unique_ptr<std::vector<char> > dataToWrite= ??
//
scheduleWrite(dataToWrite);
}
void scheduledWrite(std::unique_ptr< std::vecor<char> > data)
{
…
}
std :: unique_ptr in questo esempio per illustrare trasferimento della proprietà: qualsiasi altro approccio con la stessa semantica va bene per me.
Mi chiedo soluzioni a questo caso specifico (con std :: string char buffer) e questo tipo di problema con stringhe, stream e simili generali: suggerimenti per avvicinarsi ai buffer in movimento tra stringhe, stream, contenitori std e buffer tipi.
Avrei anche apprezzato suggerimenti e collegamenti con approcci di progettazione C++ e tecniche specifiche quando si tratta di passare i dati del buffer tra diverse API/tipi senza copiare. Menziono ma non uso i flussi perché sono tremolante su quell'argomento.
Non è possibile, perché non v'è alcun modo per recuperare il memoria in modo sicuro. A un certo punto dovresti rilasciare il buffer, quindi perché non tenere la corda fino in fondo, cosa che fa automaticamente? –
È meglio scrivere la propria implementazione di stringa – Gigi
'std :: unique_ptr' sarebbe l'unica cosa che consente qualcosa di simile. –
ildjarn