動的サイズのストレージ クラスB1
とします。
(例) B2
B1~std::vector<char>
B2~std::vector<float>
C++11 では、 and と 関数をコーディングするB1
と(ルール オブ ファイブ)、それらをフィールドとして含むクラスは、デフォルトで自動的に正しくコピー/移動します。B2
move
copy
C
class C{
B1 b1; B2 b2;
};
それは非常にうまく機能します。
問題
今日、プロファイルの結果を取得し、パフォーマンスの問題についていくつかのテストを行いました。
主な目的:私は、互いに近くにメモリを割り当てる同じインスタンスを作成する必要がb1
あります:-b2
C
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
/ move
mess は と にのみ表示されB1
ますB2
。現在、データ構造を直接
使用するすべてのクラスで混乱が発生しています。B1
B2
質問
役立つC++のテクニック/デザインパターン/イディオムは何ですか?
答えるために、実行可能なコードは必要ありません。擬似コードまたは概念だけで十分です。
MCVEを提供できなかったことをとても残念に思っています。
カスタムアロケータと配列管理は、最小化にとって非常に難しいものです。