2012-06-21 10 views
5

STLコンテナをDLL境界に公開するのは良い考えではありませんが、一般的には不可能です(this answer for whyおよびthis oneを参照してください。境界)。私は別の(VC08/VC10 +)コンパイラでコンパイルされたDLLとEXEの間でデータを渡すことができる必要があります。 this Qは、すべてが同じであることのみを処理します。dll境界にstd :: vectorを公開する - コンパイラの独立性のベストプラクティス

公開するにはどうすればよいですか?ベクトルは、メモリが連続していることが保証されている点でリストとは少し異なります。したがって、複素数のconstベクトルが必要な場合は、ブロックの開始ポインタと終了ポインタをdllの関数に渡すだけですか? dllはまた、ベクトルの配列のようないくつかの構造体を返す必要があります。

私は、開始および終了ポインタを含む構造体について疑問に思った:

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

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

それが賢明でしょうか?おそらく関数から返されるものには、それが指しているものを破壊するデストラクタ(dll側で)が必要になるでしょう。

+2

関連するお読みください:http://stackoverflow.com/questions/5661738/common-practice-in-dealing-with-warning-c4251-class-needs-to-have-dll-inter/5664491#5664491 –

+0

Cheers @JohnDibling、それはSTLコンテナを直接公開しない理由の良い説明です。したがって、データそのものを公開する方法の問題。私は連続した要求がそれ以上のコピーをせずに可能になることを望んでいる。 –

+0

単純な古い配列を渡すだけではどうですか? – Rook

答えて

3

あなたはそれをかなり釘付けにしました。標準では、ベクトル要素はメモリ内で連続している必要があり、ベクトル要素はスタックアロケートされません。ただし、ベクトルのアロケータを使用してゲームをプレイしない限り、ベクターのデータを開始ポインタおよび終了ポインタとして表現することは常に可能です開始ポインタとサイズ、それがあなたのものならば)。あなたが持っているものはうまくいくはずです。

しかし、私はどれだけ使用されているのかわかりません。 std::vectorは、自動メモリ管理以外の何ものも提供していません。さもなければ、あなたがDLLで構築するベクトルは、破壊されたときにオリジナルの倍精度配列を解放します。あなたは配列をコピーすることでそれを回避することができますが、あなたはそれをしたくないと言いました。 STLアルゴリズムはポインタ上でうまく動作するので、DLLを変換する必要はありません。

+0

それは私に呼び出しコード内で自動的にメモリ管理を行い、呼び出されたコード内のローカルで宣言されたベクトルを返します。したがって、dllに渡されたベクトルは、デストラクターが呼び出されたとき(dllの中に戻る)に返されるベクトルと同様に、スコープから外れると自動的に破棄されます。 –

関連する問題