2012-06-21 10 views
5

Exponer contenedores STL sobre límites de DLL no es una buena idea, y generalmente no es posible (ver this answer for why y this one sobre exponer una std :: list a dll límite). Necesito poder pasar datos entre DLL y EXE compilados con compiladores diferentes (VC08/VC10 +); this Q solo trata de que todo sea lo mismo.Exponer std :: vector en un límite dll: práctica recomendada para la independencia del compilador

¿Cuál es la mejor manera de exponerlos? Los vectores son un poco diferentes de las listas en cuanto a que se garantiza que la memoria es contigua, así que si solo necesito un vector de dobles, ¿puedo simplemente proporcionar punteros de inicio y final al bloque para la función en el dll? La dll también necesita devolver alguna estructura como una matriz de vectores.

Me preguntaba sobre una estructura que contiene punteros comienzan y finales:

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

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

Sería eso sensato? Presumiblemente, cualquier cosa que se devuelva de la función necesitaría un destructor (en el lado dll) que destruye las cosas a las que apunta.

+2

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

+0

Saludos @JohnDibling, esa es una buena explicación de por qué no exponer contenedores STL directamente. De ahí la cuestión de cómo exponer los datos en sí. Espero que el requisito contiguo lo haga posible sin más copias. –

+0

¿Por qué no pasar simplemente una matriz simple? – Rook

Respuesta

3

Lo has logrado. El estándar requiere que los elementos del vector sean contiguos en la memoria, y los elementos del vector no se asignarán en pila a menos que juegues con el asignador del vector, por lo que siempre es posible representar los datos del vector como un puntero inicial y final (o un puntero de inicio y un tamaño, si eso es lo tuyo). Lo que tienes debe funcionar bien.

Sin embargo,, no estoy seguro de su uso. std::vector realmente no le ofrece nada, excepto administración de memoria automática, y no quiere eso; de lo contrario, cualquier vector que construyas en la DLL, cuando sea destruido, desasignará tu matriz original de dobles. Puedes evitarlo copiando la matriz, pero dijiste que tampoco querías hacer eso. Los algoritmos STL funcionan bien en los punteros, por lo que tal vez no sea necesario convertirlos en la DLL.

+0

Me da administración de memoria automática dentro del código de llamada y los vectores declarados localmente en el código llamado, incluido el vector de retorno, creo. Por lo tanto, los vectores que pasan al dll se destruirán automáticamente cuando caigan fuera del alcance, al igual que el vector devuelto cuando se llame a su destructor (dentro del dll). –

Cuestiones relacionadas