0

データ バッファーへのプライベート unsigned char * を持つクラスがあります。データ バッファーの長さは可変なので、malloc() と free() を使用して、データを保持するために必要なメモリ量を割り当てます。

私の問題は、このデータにアクセスする必要がある別のクラスがあることです。私が現在行っている方法は、バッファの作業コピーを作成し、それを他のクラスに渡すことです。つまり、copy で指定されたバッファーに size バイトをコピーする関数 get_data(unsigned char * copy, int size) があります。バッファーは小さい (約 50 バイト) ですが、プログラムの過程でこの ALOT を実行する必要があります。その結果、これをより合理化できる方法を探しています。

データ バッファー ポインターを他のクラスに渡す方法はありますか? 彼らはバッファ内のデータを上書きできますか? データ バッファー ポインターの const コピーを送り返すことができることは承知していますが、呼び出し元は const_cast を呼び出して自由に変更できます。つまり、const_cast を呼び出してから、buf_ptr[2] = 0xFF; の行に沿って何かを呼び出すことができます。

助けてくれてありがとう。呼び出し元が何か厄介なことをした場合にデータを破損する可能性がなくても、ポインターを使用できる方法があることを願っています。

4

4 に答える 4

0

シンプルで機能する2つのソリューションを次に示します。

1) 個々の配列に対して従来の getter メソッドと setter メソッドを使用するだけです。get(0)、get(1) などにアクセスして配列を反復処理するようにします。設定も同じように機能します。問題は、関数呼び出しのオーバーヘッドが発生することです (おそらくインライン関数でない限り? かなり最適化されている可能性があります)。また、配列を使用するためにプログラムを大幅に再構築する必要があります。

または、単に

2) 配列へのポインターを返す何かを持っています。プライベート データは、ポインターを使用して引き続き変更できます。したがって、配列へのポインターを返すだけで、その後のすべて (要素の設定と取得) は高速かつ簡単になります。

したがって、配列を他の関数で変更できるようにしたい場合は、ポインターが最善の策です。そうでない場合は、速度のためにインラインで宣言された単純な「get」演算子と、[] 演算子をオーバーロードする可能性がある場合は、うまく機能します。

于 2013-06-06T00:21:15.947 に答える
0

これを処理するには、次の 2 つの方法があります。

  1. データにはa を使用std::shared_ptrします。
  2. データにはa を使用std::vector<char>します。

次に、共有ポインタ (最初のケース) またはベクトルへの参照 (2 番目のケース) を返す「getter」関数を作成します。呼び出し元にデータを変更させたくない場合は、戻り値を作成できますconst

于 2013-06-06T00:06:10.223 に答える
0

const unsigned char *私はむしろ、言及されたような水田を返したいだけです。しかし、別のオプションは、インデックスを使用して配列の個々の要素にアクセスできるようにすることです。例えば:

unsigned char get_data(size_t index) const
{
    // you can even put a bounds check in here if you want
    return m_private_buffer[index];
}

または、これをオーバーロードすることもできますoperator[]

于 2013-06-06T00:09:02.293 に答える