इसके लिए क्या योग्य है ... आप एक और मुहावरे का उपयोग करने से भी लाभ प्राप्त कर सकते हैं।
मुझे पता है कि Flyweight
पैटर्न काफी क्रोध है, लेकिन यहां आप उन लाखों वस्तुओं को आवंटित करने से भी लाभ उठा सकते हैं।
यदि यह अजीब लगता है, तो String
ऑब्जेक्ट Python
पर विचार करें। जैसा कि हाल की भाषाओं में, String
Python
में अपरिवर्तनीय हैं। बेशक, जिस वस्तु का आप उपयोग करते हैं वह बदल सकता है, लेकिन वास्तविक String
नहीं है: आपका हैंडल बस स्थानांतरित हो गया है।
बेशक, Python
में स्वचालित कचरा संग्रह है जो इसे अधिक आसान बनाता है, फिर भी यह आपके लिए भी काम कर सकता है।
class FooImpl;
class Foo
{
public:
explicit Foo(int i): mImpl(FooImpl::Build(i)) {}
int foo() const { return mImpl->foo(); }
void foo(int i) { mImpl = mImpl->foo(i); }
private:
const FooImpl* mImpl;
}; // class Foo
class FooImpl
{
public:
static const FooImpl* Build(int i)
{
typedef std::unordered_set<FooImpl> foos_type;
FooImpl tmp(i);
foos_type::iterator it = gFooImplCollection.insert(tmp);
return &(*it);
}
int foo() const { return mFoo; }
const FooImpl* foo(int i) const
{
return Build(i);
}
// Useful thingy
bool operator==(const FooImpl& rhs) const { return mFoo == rhs.mFoo; }
size_t hash() const { return mFoo; }
private:
explicit FooImpl(int i): mFoo(i) {}
int mFoo;
};
std::unordered_set<FooImpl> gFooImplCollection;
बेशक
, यह बहुत किसी न किसी केवल आपके जानकारी देने के लिए है, यहाँ एक स्केच है। यदि विभिन्न वस्तुओं की संभावित संख्या महत्वपूर्ण है, तो आपको कचरा संग्रह की आवश्यकता है।
कचरा संग्रह एक और विषय है, मैं आपको Immutable
कोर क्लास (केवल const
विधियों का खुलासा करता है) और एक परिवर्तनीय हैंडल (जो कि कोर क्लास को बदलने के लिए कहा जाने पर इंगित करता है) के विचार के साथ आपको छोड़ना पसंद करता है।
और अब है कि आप, समय पढ़ने के लिए लिया है बूस्ट यह है
: Boost.Flyweight :)
नोट:
यह पर सटीक करने के लिए महत्वपूर्ण लगता है, क्योंकि Foo
आवंटित किया जाता है (ढेर) लाखों बार, इसका आकार एक सूचक के लिए जितना संभव हो उतना करीब रहना चाहिए। यह Intrusive
संदर्भ couting का उपयोग करके पूरा किया जाता है (मुझे उम्मीद है कि बूस्ट क्या करता है)। इसके अलावा, virtual
Foo
में virtual
FooImpl
में 10 और Build
वास्तव में दृश्यों के पीछे AbstractFactory
पर कॉल करने के लिए अनावश्यक है।
इस प्रकार, Foo
के बाद से:
- किसी भी आधार वर्ग नहीं है
- किसी भी आभासी तरीकों
- केवल एक विशेषता (एक सूचक)
इसका प्रभावी आकार में नहीं है पॉइंटर का आकार होगा ... जो कि आप उम्मीद कर सकते हैं कि आप प्रत्येक आईडी पर एक आईडी को लुकअप लागत नहीं लेना चाहते हैं :)
वर्चुअल फ़ंक्शंस होने से ऑब्जेक्ट में केवल 4 और बाइट जोड़े जाते हैं (64-बिट के लिए 8)। बेस क्लास से व्युत्पन्न कुछ भी नहीं है। (ये एकल विरासत मानते हैं।) – kennytm
आपको कस्टम आवंटक का उपयोग करके आवंटन को तेजी से बनाना चाहिए। – yesraaj
आपको क्या करना चाहिए इस पर निर्भर करता है कि आप क्या कर रहे हैं। तुम क्या कर रहे हो? – GManNickG