1

クラスがあるとします:

class A
{
  private:
    const int * const v;
  public:
    A();
}

初期化リストに割り当てたいvのですが、次のコンストラクターを定義できると思います。

A::A():v((int*)malloc(10*sizeof(int))){}

ただし、 v は次のような非標準的な方法で割り当てる必要があります。

cudaMalloc(&v,10*sizeof(int));

cudaMallocGPU メモリを割り当てる CUDA API に注意してください。

4

2 に答える 2

8

(全体的な設計、例外の安全性などのより大きな問題を無視し、最も狭い範囲の問題に焦点を当てます)

イニシャライザリストで行うという考えを捨て、代わりにコンストラクタ本体で行う

A::A() : v(NULL)
{
  cudaMalloc(&v, 10 * sizeof(int));
}

または、代わりに、ポインターを返す独自の関数に割り当て関数をラップします

void *wrapped_cudaMalloc(size_t size)
{
  void *m = NULL;
  cudaMalloc(&m, size);
  return m;
}
...

A::A() : v(wrapped_cudaMalloc(10 * sizeof(int)))
  {}

完全を期すために、,演算子のプロパティを利用してラッパーを作成せずに、イニシャライザリストでそれを行う醜い複雑な方法もあります

A::A() : v((cudaMalloc(&v, 10 * sizeof(int)), v))
  {}

()初期化構文を満たすために必要なコンマ式の前後の追加のペアに注意してください(そうでない場合,は、コンマ演算子ではなく引数セパレータとして扱われます)。

于 2013-05-23T23:08:38.283 に答える
3

AndreyT の優れた投稿 (およびコンマ演算子の独創的な使用) に加えて、次のようにまとめることもできます。

class cudaMallocedInt
{
private:
    int *v;

public:
    cudaMallocedInt(int n)
    {
        cudaMalloc(&v, n * sizeof(int));
    }

    cudaMallocedInt(const cudaMallocedInt &o)
    {  
        // Do whatever is appropriate here. Probably some sort of dance.
    }

    ~cudaMallocedInt()
    {
        // Remember to cudaFree or whatever
    }

    operator int*()
    {
        return v;
    }
};

class A
{
private:
    cudaMallocedInt v;

public:
    A()
        : v(10)
    {
    }

    ...
};

更新: Johnsyweb がコメントで指摘したように、3 つのルールを必ず守って、物事がブームにならないようにしてください。また、楽しい時間を過ごす代わりに、エラーをデバッグするのに苦労して週末を無駄にします!

于 2013-05-23T23:18:47.823 に答える