Sto lavorando con una funzione che restituisce alcuni dati come std::vector<char>
e un'altra funzione (si pensi alle API legacy) che elabora i dati e prende uno const char *, size_t len
. C'è un modo per staccare i dati dal vettore in modo che il vettore possa uscire dall'ambito prima di chiamare la funzione di elaborazione senza copiando i dati contenuti nel vettore (è ciò che intendo implicare con scollegando).Posso staccare un std :: vector <char> dai dati che contiene?
Alcuni codice di schizzo per illustrare lo scenario:
// Generates data
std::vector<char> generateSomeData();
// Legacy API function which consumes data
void processData(const char *buf, size_t len);
void f() {
char *buf = 0;
size_t len = 0;
{
std::vector<char> data = generateSomeData();
buf = &data[0];
len = data.size();
}
// How can I ensure that 'buf' points to valid data at this point, so that the following
// line is okay, without copying the data?
processData(buf, len);
}
Perché non solo mantenere il 'data' vettore nell'ambito funzione e la chiamano' processData (e dei dati [0], data.size()) ' ?? –
@David Rodríguez - dribeas: In * this code sketch *, l'ambito di 'processData()' è l'antenato diretto dell'ambito di 'data'. Tuttavia, nelle basi di codice del mondo reale, potrebbero esserci dozzine di frame di stack tra i due ambiti. Oppure immagina se 'processData' pubblicherebbe il puntatore e la lunghezza del buffer specificato su un altro thread e poi ritornerà immediatamente - devi assicurarti che i dati rimangano validi fino a quando il thread del consumatore non lo ha elaborato. Questi sono solo due esempi in cui potresti voler disaccoppiare la durata di un contenitore dalla durata dei dati contenuti. –
Abbastanza divertente la risposta che hai accettato è esattamente quello che ho indicato nel commento precedente, reso ancora più complesso ... invece di usare un vettore locale e scambiare con il globale, basta usare il globale ... Ora, questo è diverso da cosa stai dicendo ora. Il trasferimento di proprietà e la gestione della durata sono gestiti meglio con indicatori (intelligenti): basta tenere il contenitore attraverso un puntatore e passare la proprietà intorno ... –