बढ़ाने से जीसीसी में std :: फ़ंक्शन को रोकें क्या gcc में std::function
को बड़ी फ़ंक्शन ऑब्जेक्ट्स के लिए गतिशील रूप से आवंटित करने से रोकने का कोई तरीका है?स्मृति को आवंटित करने या थ्रेसहोल्ड
मैं निम्नलिखित कोड गतिशील आवंटन के बिना काम करने की उम्मीद है |:
#include <functional>
#include <iostream>
// replace operator new and delete to log allocations
void* operator new (std::size_t n) {
std::cout << "Allocating " << n << " bytes" << std::endl;
return malloc(n);
}
void operator delete(void* p) throw() {
free(p);
}
class TestPlate
{
private:
int value;
public:
int getValue(){ return value; }
void setValue(int newValue) { value = newValue; }
int doStuff(const std::function<int()>& stuff) { return stuff(); }
};
int main()
{
TestPlate testor;
testor.setValue(15);
const std::function<int()>& func = std::bind(&TestPlate::getValue, &testor);
std::cout << testor.doStuff(func) << std::endl;
testor.setValue(25);
std::cout << testor.doStuff(func) << std::endl;
}
हालांकि यह 24 बाइट्स आवंटित करता है। जहां तक मैं यह बताने में सक्षम हूं क्योंकि विधि के लिए सूचक 16 वर्गों की आवश्यकता होती है और कक्षा के सूचक के लिए सूचक 8 अन्य बाइट्स की आवश्यकता होती है। ऐसा लगता है कि फ़ंक्शन ऑब्जेक्ट या बी को सादा बग के लिए उपलब्ध आंतरिक मेमोरी से बड़ा बड़ा लगता है।
मैं सोच रहा था कि std::function
के हस्ताक्षर को बदले बिना या अतिरिक्त अतिरिक्त रैपर कोड बनाने के बिना इस प्रकार के व्यवहार को रोकने के लिए कोई तरीका है या नहीं।
मानक राज्यों कि _ कार्यान्वयन को छोटे कॉल करने योग्य वस्तुओं के लिए गतिशील रूप से आवंटित स्मृति के उपयोग से बचने के लिए प्रोत्साहित किया जाता है, उदाहरण के लिए, जहां एफ एक वस्तु है जो किसी ऑब्जेक्ट को संदर्भित करता है या किसी सदस्य फ़ंक्शन पॉइंटर_ को संदर्भित करता है। कंपाइलर्स अपना सर्वश्रेष्ठ प्रदर्शन करते हैं। यदि यह आपकी आवश्यकताओं के अनुरूप नहीं है, तो ... – skypjack
क्लैंग + libC++ आपके उदाहरण में किसी भी स्मृति को आवंटित नहीं कर रहा है (http://coliru.stacked-crooked.com/a/52505806440111db) – Praetorian