私は主に見せかけstruct
秒であり、組成物による相互に依存しているCUDAプロジェクト内のクラスの束を持っている:カプセル化と構造化 - これは悪いスタイルと考えられますか?
class A {
public:
typedef boost::shared_ptr<A> Ptr;
A(uint n_elements) { ... // allocate element_indices };
DeviceVector<int>::iterator get_element_indices();
private:
DeviceVector<int> element_indices;
}
class B {
public:
B(uint n_elements) {
... // initialize members
};
A::Ptr get_a();
DevicePointer<int>::iterator get_other_stuff();
private:
A::Ptr a;
DeviceVector<int> other_stuff;
}
DeviceVector
はthrust::device_vector
の単なるラッパーであると::iterator
はにキャストすることができます生のデバイスポインタ。カスタムカーネルが呼び出され、デバイスメモリへのハンドルが必要になるため、これが必要です。 A
とB
を使用してクラスがGPU上でカスタムカーネルを実行できるように
さて、私はカプセル化を気にしますが、データへ
- 生のポインタんが
- 、公開する必要がデフォルトコンストラクタがあります望ましくない、デバイスメモリを自動的に割り当てられなければならない - >
shared_ptr<T>
A
とB
にごく少数の方法が
ので、一つは単純に使用して、構造体
struct A {
void initialize(uint n_elements);
DeviceVector<int> element_indices;
}
struct B {
void initialize(uint n_elements);
A a;
DeviceVector<int> other_stuff;
}
私はカプセル化の意味で、これは実質的に同等であることを正しいですか思ったんだけどによりはるかに簡単な生活を作ることができます。もしそうなら、全体のコンセプトに間違っていることがあり、ある時点で噛む可能性がありますか?
C++のクラスと構造体の唯一の違いは、デフォルトの可視性(クラスのprivate、structのpublic)です。コンパイラは、何も指定しなければデフォルトのコンストラクタを与えます。したがって、あなたの構造体例の初期化関数の目的がわかりません。 – jpm
あなたの質問は本当に "カプセル化対公開データ"について質問しています。 jpmは 'struct'を使うのは正しいです。 –
"class"と "struct"という単語は、オブジェクトデザインの意味合いが少し強くなっています。これらの用語を混乱させる原因はC++です。 :) –