その他のいくつかは、基本的なC実装の答えを提供します。
ここでは、配列要素のいずれもコピーせずに仮想連結配列を作成するクラスの汎用C++実装のサンプルコードを示します。作成された仮想配列は、通常のベクトルのように(読み書きするために)インデックスできます。
#include <vector>
#include <map>
#include <iostream>;
using namespace std;
class VirtualArray {
public:
multimap<int,double*> startIndices; // reverse map of starting index to its sub array
int size;
VirtualArray() : size(0) {}
double & operator[](int i) {
// find proper subarray in log(n) time
multimap<int,double*>::iterator iter = --startIndices.upper_bound(i);
double *subarray = iter->second;
int startIndex = iter->first;
// index into subarray
return subarray[i-startIndex];
}
void addArray(double* array, int length) {
startIndices.insert(make_pair(size, array));
size += length;
}
void addVector(vector<double> & vec) {
startIndices.insert(make_pair(size, vec.data()));
size += vec.size();
}
};
int main() {
double a1[3], a2[4], a3[6] = {1, 2, 3, 4, 5, 6};
int L1 = 3, L2 = 4, L3 = 6;
vector<double> a3vec;
a3vec.assign(a3,a3+6);
VirtualArray vArray;
vArray.addArray(a1,L1);
vArray.addArray(a2,L2);
vArray.addVector(a3vec);
cout << vArray[10];
return 0;
}
なぜ配列が連続していないのですか?なぜ彼らはできないのですか?それはこの問題をはるかに容易にします。 – Patrick87
CUDAのケースでは、可能な場合であっても、それをやりたいとは思わないでしょう。ホスト→デバイスのメモリ転送の一環として、ホスト側の "フラット"コピーまたは "zip"演算子は、はるかに賢明な考えです。 – talonmies
あなたが理解できないこの問題については何ですか? – asveikau