パフォーマンスの前に人々は私の頭を引き裂きます:はい、私はこれを尋ねる前にプロファイリングを行いました:)
私はもう一度タイプコンテナの1つを調べていますが、機能するソリューションはありますが、キャッシュされるアイテムのタイプごとにヒープに個別に割り当てられるため、パフォーマンスが低下します(もちろん高価です)。
プログラムの入力の静的分析に基づいて、渡されるキャッシュオブジェクトに配置される可能性のあるすべてのオブジェクトに必要な合計サイズを知る方法を見つけました。基本的に、特定のキャッシュオブジェクトで構築できるオブジェクトのリストがあるので、キャッシュする必要がある可能性のあるサイズは事前にわかっていますが、コンパイル時ではなく、実行時のみです。
基本的に、私がやりたいのは、1つのメモリブロックを取得し、同じメモリブロック内にビットと制御対象オブジェクトをboost::make_shared
構築することです。shared_ptr
キャッシュオブジェクトはコピー不可能であり、クライアントによってポインタによって渡されるため、コピー動作を維持することを心配する必要はありません(通常は、ptr_vector
またはのようなものに格納されますstd::auto_ptr
)。
ただし、そのようなコンテナをどのように正確に実装するか、つまり、配置制限などに従う方法についてはよくわかりません。
擬似コードで、私がやりたいこと:
//I know a lot of what's in here is not portable -- I need to run only on x86
//and x64 machines. Yes, this couple of classes looks hacky, but I'd rather
//have one hacky class than a whole programfull :)
class CacheRegistrar
{
//Blah blah
public:
//Figures out what objects will be in the cache, etc
const std::vector<std::size_t>& GetRequiredObjectSizes() const;
//Other stuff...
template <typename T>
void RegisterCacheObject();
template <typename T>
std::size_t GetObjectIndex() const;
// etc.
};
class CacheObject;
std::auto_ptr<CacheObject> CacheObjectFactory(const CacheRegistrar& registrar)
{
//Pretend this is in a CPP file and therefore CacheObject is defined...
const std::vector<size_t>& sizes(registrar.GetRequiredObjectSizes());
std::size_t sumOfCache = std::accumulate(sizes.begin(), sizes.end());
sumOfCache += sizeof(CacheObject);
boost::scoped_array<char> buffer(new char[] sumOfCache);
CacheObject *obj = new (reinterpret_cast<void *>(buffer.get())) CacheObject;
buffer.release(); //PSEUDOCODE (boost::scoped_array has no release member);
return std::auto_ptr<CacheObject>(obj); //Nothrow
}
class CacheObject
{
CacheRegistrar *registrar; //Set by my constructor
public:
template<typename T>
T& Get()
{
char * startOfCache = reinterpret_cast<char *>(this) +
sizeof(CacheObject);
char * cacheItem = startOfCache + registrar->GetObjectIndex<T>();
return *reinterpret_cast<T*>(cacheItem);
}
};
私の一般的なコンセプトはここに聞こえますか?これを達成するためのより良い方法はありますか?