2

動的サイズのストレージ クラスB1とします。 (例) B2
B1~std::vector<char> B2~std::vector<float>

C++11 では、 and と 関数をコーディングするB1と(ルール オブ ファイブ)、それらをフィールドとして含むクラスは、デフォルトで自動的に正しくコピー/移動します。B2movecopyC

class C{
    B1 b1; B2 b2;
};

それは非常にうまく機能します。

問題

今日、プロファイルの結果を取得し、パフォーマンスの問題についていくつかのテストを行いました。
主な目的:私は、互いに近くにメモリを割り当てる同じインスタンスを作成する必要がb1あります:-b2C

b1[0]  b1[1] ... b1[b1.size-1] (minimum gap) b2[0]  b2[1] ... b2[b2.size-1] 

できれば、プログラム全体のパフォーマンスが 10 ~ 20% 向上します。

私の貧弱な解決策

このようなカスタム アロケーターを使用できます (疑似コード):-

class C{
    B1 b1; 
    B2 b2;
    Allocator* allo_; // can be heap allocator 
    public: void reserve(int size){
        //old : b1.reserve(size); b2.reserve(size);  .... so easy
        //new :-
        B1 b1Next; B2 b2Next;
        int nb1=b1Next.howMuchIWant(size); 
        int nb2=b2Next.howMuchIWant(size);
        //^ request amount of bytes needed if capacity="size"
        void* vPtr=allo_->allocate(nb1+nb2);
        b1Next.setMemory(vPtr);
        b2Next.setMemory(vPtr + nb1);  //add "vPtr" by "nb1" bytes
        b1Next=b1;   //copy assignment (not move memory)
        b2Next=b2;   //copy assignment (not move memory)
        b1=std::move(b1Next);   //move memory
        b2=std::move(b2Next);   //move memory 
        //clean up previous "vPtr" (not shown)
    }
};

動作しますが、コードのデバッグ/保守がはるかに難しくなります。Cの移動とコピー は言うまでもありません。

旧バージョンでは all copy/ movemess は と にのみ表示されB1ますB2。現在、データ構造を直接
使用するすべてのクラスで混乱が発生しています。B1B2

質問

役立つC++のテクニック/デザインパターン/イディオムは何ですか?
答えるために、実行可能なコードは必要ありません。擬似コードまたは概念だけで十分です。

MCVEを提供できなかったことをとても残念に思っています。
カスタムアロケータと配列管理は、最小化にとって非常に難しいものです。

4

1 に答える 1