का उपयोग करते समय std :: string/std :: वेक्टर सदस्य चर के साथ काम करना मैं एक प्रदर्शन महत्वपूर्ण अनुप्रयोग लिख रहा हूं जिसमें मैं आदेश देने के लिए समान प्रकार की वस्तुओं की बड़ी संख्या बना रहा हूं। मैं स्मृति आवंटित करने के लिए boost::singleton_pool का उपयोग कर रहा हूं। अंततः मेरी कक्षा इस तरह दिखती है।बूस्ट :: सिंगलटन_पूल
class MyOrder{
std::vector<int> v1_;
std::vector<double> v2_;
std::string s1_;
std::string s2_;
public:
MyOrder(const std::string &s1, const std::string &s2): s1_(s1), s2_(s2) {}
~MyOrder(){}
static void * operator new(size_t size);
static void operator delete(void * rawMemory) throw();
static void operator delete(void * rawMemory, std::size_t size) throw();
};
struct MyOrderTag{};
typedef boost::singleton_pool<MyOrderTag, sizeof(MyOrder)> MyOrderPool;
void* MyOrder:: operator new(size_t size)
{
if (size != sizeof(MyOrder))
return ::operator new(size);
while(true){
void * ptr = MyOrderPool::malloc();
if (ptr != NULL) return ptr;
std::new_handler globalNewHandler = std::set_new_handler(0);
std::set_new_handler(globalNewHandler);
if(globalNewHandler) globalNewHandler();
else throw std::bad_alloc();
}
}
void MyOrder::operator delete(void * rawMemory) throw()
{
if(rawMemory == 0) return;
MyOrderPool::free(rawMemory);
}
void MyOrder::operator delete(void * rawMemory, std::size_t size) throw()
{
if(rawMemory == 0) return;
if(size != sizeof(Order)) {
::operator delete(rawMemory);
}
MyOrderPool::free(rawMemory);
}
मैं हाल ही में बढ़ावा :: singleton_pool का उपयोग करने में प्रदर्शन लाभ के बारे में question तैनात। जब मैंने boost::singleton_pool और डिफ़ॉल्ट आवंटक के प्रदर्शन की तुलना की, तो मुझे कोई प्रदर्शन लाभ नहीं मिला। जब किसी ने इंगित किया कि मेरी कक्षा के प्रकार std :: स्ट्रिंग के सदस्य हैं, जिनके आवंटन को मेरे कस्टम आवंटक द्वारा शासित नहीं किया जा रहा था, मैंने std :: string variables को हटा दिया और परीक्षणों को फिर से चलाया। इस बार मैंने एक काफी प्रदर्शन बढ़ावा देखा।
अब, मेरे वास्तविक आवेदन में, मैं समय std :: string और std :: vector के सदस्य चर से छुटकारा नहीं पा सकता हूं। क्या मुझे अपने std :: string और std :: vector सदस्य चर के साथ boost::pool_allocator का उपयोग करना चाहिए?
बढ़ावा :: pool_allocator एक अंतर्निहित std :: singleton_pool से स्मृति आवंटित करता है। क्या इससे कोई फर्क नहीं पड़ता कि अलग-अलग सदस्य चर (मेरे पास MyOrder क्लास में एक से अधिक std :: स्ट्रिंग/std :: वेक्टर प्रकार हैं। इसके अलावा मैं MyOrder के अलावा अन्य कक्षाओं के लिए पूल नियोजित कर रहा हूं जिसमें std :: string/std :: वेक्टर प्रकार शामिल हैं सदस्यों के रूप में भी) एक ही मेमोरी पूल का उपयोग करें? अगर ऐसा होता है, तो मैं कैसे सुनिश्चित कर सकता हूं कि वे एक या दूसरे तरीके से करते हैं?
कॉन्स और अपने कन्स्ट्रक्टर में उपयोग करें। –
@EternalLearner गुड प्वाइंट। यह एक प्रति को रोक देगा। किया हुआ। – sank
क्या वास्तव में std :: weak_ptr या std :: स्ट्रिंग्स में कुछ का उपयोग करने के लिए थोड़ा और उचित नहीं होगा? निजी आंतरिक प्रतियों के संदर्भ लेना हमेशा मुझे गलत लगता है। भले ही आप प्रतिलिपि को रोक दें ... –