C++17環境です.
Cで作られたプロジェクトからC++で作られた外部ライブラリをコールするためにCの配列とstd::vectorを行ったり来たりする必要があります
現状ではC配列とstd::vectorへの相互変換がdeep copyになってしまっています
実行速度やメモリ量が無駄なのでstd::vectorの参照するポインタを変更したいのですが、良い方法はないでしょうか
イメージとしては以下のようなプログラムです
cpp
1void external_lib_func(&std::vector<int> vec); //これは外部のライブラリなので変更できない 2 3void func(int* d, size){ //この関数のAPIをstd::vectorに変更はできない 4 std::vector<int> vec_d(size); //これは無駄 5 6 for(size_t i = 0; i<所定の回数; i++){ 7 // Cで書かれた色々な処理によってdが変更される // 8 9 // ここでC配列 -> std::vectorへ変換するためにdeep copyが必要 10 for(size_t j = 0; j < size; j++){ 11 vec_d[i] = d[i]; 12 } 13 14 external_lib_func(vec_d); //vec_dが変更される 15 16 // std::vecor -> C配列も同様 17 for(size_t j = 0; j < size; j++){ 18 d[i] = vec_d[i]; 19 } 20 21 // Cで書かれた色々な処理によってdが変更される // 22 } 23}
全部std::vectorに変えれば上手くいくことは分かっているのですが、この func()
関数はFortranからも呼び出されているため難しいのが現状です
> 実行速度やメモリ量が無駄なのでstd::vectorの参照するポインタを変更したいのですが、良い方法はないでしょうか
それは不可能なので、質問を変えてもらえますか?
「この関数を効率的にするにはどうすればいいですか」とか
std::vector を C配列に見せかけるのは簡単だけど 逆は無理。
> 「この関数を効率的にするにはどうすればいいですか」とか
どちらかというと計算時間よりメモリのほうが厳しいのですが、質問を変更して解決策はありそうでしょうか?
C++20 なら std::to_array で std::array に変換できるようですが…。
https://cpprefjp.github.io/reference/array/to_array.html
> std::to_array で std::array に変換できるようです
ありがとうございます
Clangなのでまだ対応していないようですが、長期的に使うコードなので、頭に留めておきます
vectorではないことはとりあえずおいといて・・・
to_arrayは変換ではなく作成してしまうヤツだったかと
yominet さまのおっしゃる通り、std::to_array はコピーを作るものですね。失礼しました。
その代わり、配列をコピーせずにコレクションにラップするものとして std::span が使えそうな気がします。
https://stackoverflow.com/questions/45723819/what-is-a-span-and-when-should-i-use-one
質問を変更して解決策があるかは、どのように変えるかによりますが、少なくとも今の質問(ディープコピーしか出来ないものをディープコピーしたくない)は本質的ではないので建設的な回答は難しいですね。
わかりました
たくさんレスを貰っていますし、できないという回答も回答として重要だと思うので、この質問はこの質問として、どこまで許容するかも踏まえて考えて別の質問にします