2012-06-21 14 views
5

L'esposizione di contenitori STL oltre i limiti DLL non è una buona idea e generalmente non è possibile (vedere this answer for why e this one sull'esposizione di uno std :: list su una dll confine). Devo essere in grado di passare i dati tra DLL ed EXE compilati con diversi (VC08/VC10 +) compilatori; this Q si occupa solo di tutto uguale.Esposizione di std :: vector su un limite di dll - best practice per indipendenza del compilatore

Qual è il modo migliore per esporli? I vettori sono un po 'diversi dagli elenchi in quanto la memoria è garantita come contigua, quindi se ho solo bisogno di un vettore const di doppi, posso semplicemente fornire puntatori di inizio e fine al blocco alla funzione nella dll? La DLL deve anche restituire alcune strutture come una matrice di vettori.

ho domandato circa una struct contenente iniziano e puntatori finali:

template <typename T> 
struct vecWrapper<T> { 
    T* begin; 
    T* end; 
} 

// in the dll 
int func(vecWrapper<double> numbers); 

Vorrei che sia ragionevole? Presumibilmente, qualsiasi cosa sia restituito dalla funzione avrebbe bisogno di un distruttore (sul lato dll) che distrugge le cose a cui punta.

+2

Correlati, leggere: http://stackoverflow.com/questions/5661738/common-practice-in-dealing-with-warning-c4251-class-needs-to-have-dll-inter/5664491#5664491 –

+0

Cheers @JohnDibling, questa è una buona spiegazione del perché non esporre direttamente i contenitori STL. Di qui la domanda su come esporre i dati stessi. Spero che il requisito contiguo lo renda possibile senza ulteriore copia. –

+0

Perché non passare semplicemente un semplice vecchio array? – Rook

risposta

3

Hai praticamente inchiodato. Lo standard richiede che gli elementi vettoriali siano contigui nella memoria e gli elementi vettoriali non saranno allocati allo stack a meno che non si stia giocando con l'allocatore del vettore, quindi è sempre possibile rappresentare i dati del vettore come un puntatore iniziale e finale (o un puntatore iniziale e una dimensione, se questo è il tuo caso). Quello che hai dovrebbe funzionare bene.

Tuttavia, non sono sicuro di quanto sia utile. std::vector in realtà non offre nulla se non la gestione automatica della memoria, e non lo vuoi; in caso contrario, qualsiasi vettore che costruisci nella DLL, quando viene distrutto, rilascia la tua matrice originale di doppi. Puoi aggirare questo copiando l'array, ma hai detto che non vuoi farlo neanche tu. Gli algoritmi STL funzionano bene sui puntatori, quindi forse non c'è bisogno di convertire nella DLL.

+0

Mi dà la gestione automatica della memoria all'interno del codice chiamante e dei vettori dichiarati localmente nel codice chiamato, compreso il vettore di ritorno, penso. Quindi i vettori passati alla dll verranno automaticamente distrutti quando cadranno dal campo di applicazione, così come il vettore restituito quando viene chiamato il suo distruttore (di nuovo all'interno della DLL). –

Problemi correlati