एसटीडी हेडर फाइल में कंटेनरों की विनाशकर्ता करने के लिए आंकड़े कोड जोड़ें:
आप ऐसा ही कुछ कर सकते हैं। बड़ी परियोजना के बड़े पैमाने पर कोड को संशोधित करने की आवश्यकता नहीं है। लेकिन यह केवल कंटेनर प्रकार भी दिखाता है (यहां मेरा दूसरा जवाब देखें)। विधि को C++ 0x या C++ 11 या किसी और की आवश्यकता नहीं है।
पहले और अनिवार्य कदम त्वरित दृश्य क्या वास्तव में बदल दिया गया है के लिए और संशोधित और मूल संस्करण के बीच त्वरित स्विच के लिए स्रोत नियंत्रण, उदाहरण के लिए Git के तहत अपने एसटीडी पुस्तकालय को जोड़ने के लिए, है।
प्लेस एसटीडी पुस्तकालय सूत्रों फ़ोल्डर में Stat
वर्ग की इस घोषणा:
class Stat {
std::map<std::string,int> total;
std::map<std::string,int> maximum;
public:
template<class T>
int log(std::string cont, size_t size) {
std::string key = cont + ": " + typeid(T).name();
if(maximum[key] < size) maximum[key] = size;
total[key] += size;
}
void show_result() {
std::cout << "container type total maximum" << std::endl;
std::map<std::string,int>::const_iterator it;
for(it = total.begin(); it != total.end(); ++it) {
std::cout << it->first << " " << it->second
<< " " << maximum[it->first] << std::endl;
}
}
static Stat& instance();
~Stat(){ show_result(); }
};
का दृष्टांत Stat
वर्ग की सिंगलटन के कहने अपनी परियोजना cpp फ़ाइल पर:
Stat& Stat::instance() {
static Stat stat;
return stat;
}
संपादित एसटीडी पुस्तकालय कंटेनर टेम्पलेट्स। विनाशकों पर सांख्यिकीय लॉगिंग जोड़ें।
// modify this standart template library sources:
template< T, Allocator = std::allocator<T> > vector {
...
virtual ~vector() {
Stat::instance().log<value_type>("std::vector", this->size());
}
};
template< Key, T, Compare = std::less<Key>,
Allocator = std::allocator<std::pair<const Key, T> > map {
...
virtual ~map(){
Stat::instance().log<value_type>("std::map", this->size());
}
};
अब उदाहरण के लिए एक कार्यक्रम पर विचार करें:
int main() {
{
// reject to use C++0x, project does not need such dependency
std_vector<int> v1; for(int i=0;i<10;++i) v1.push_back(i);
std_vector<int> v2; for(int i=0;i<10;++i) v2.push_back(i);
std_map<int,std::string> m1; for(int i=0;i<10;++i) m1[i]="";
std_map<int,std::string> m2; for(int i=0;i<20;++i) m2[i]="";
}
Stat::instance().show_result();
return 0;
}
जीसीसी के लिए परिणाम है:
container type total maximum
std::map: St4pairIiSsE 30 20
std::vector: i 20 10
आप अधिक विस्तृत प्रकार desription से जानकारी के विषय में लगता है की जरूरत है अपने विकास पर्यावरण। इस तरह के रूपांतरण यहाँ जीसीसी के लिए वर्णित: https://lists.gnu.org/archive/html/help-gplusplus/2009-02/msg00006.html
आउटपुट इस तरह हो सकता है:
container type total maximum
std::map: std::pair<int, std::string> 30 20
std::vector: int 20 10
मैं ऐसे valgrind या शुद्ध रूप में एक स्मृति निगरानी उपकरण का प्रयोग करेंगे। – SergeyA
आप किस मंच पर हैं? मैं उस उपकरण का उपयोग करके इस पर पहुंचूंगा जो ग्लोबल मेमोरी आवंटक को हुक करता है। विजुअल स्टूडियो 2015 में आवंटन का विश्लेषण करने के लिए उपकरणों में शक्तिशाली बनाया गया है, उपकरण अन्य प्लेटफॉर्म के लिए भी मौजूद हैं। – mattnewport
@ सर्गेय: क्या आप कृपया उल्लेख कर सकते हैं कि यहां वाल्ग्रिंड का उपयोग कैसे किया जा सकता है? – Arun