2012-05-21 12 views
7
struct test_struct 
{ 
    test_struct() {} 
    ~test_struct() {} 
}; 

#include <vector> 
#include <memory> 
#include <cstdio> 

int main() 
{ 
    printf("ctor begin\n"); 
    { 
     std::vector<std::unique_ptr<test_struct>> test_vec; 
     const int count = 100000; 

     for (auto i = 0; i < count; i++) { 
      test_vec.emplace_back(new test_struct); 
     } 
     printf("dtor begin\n"); 
    } 
    printf("dtor end\n"); 
} 

मैं वीएस -2010 का उपयोग कर रहा हूं, और कुछ हास्यास्पद प्रदर्शन समस्या मिली। उपरोक्त कोड डीबग और रिलीज बिल्ड (ctrl + f5) दोनों में अच्छी तरह से काम करता है, लेकिन जब डीबगर संलग्न होता है (f5), unique_ptr क्लास के लिए dtor कॉल असहिष्णु रूप से धीमा होता है। परिणाम मशीन कोड काफी अनुकूलित है, इसलिए मुझे उम्मीद नहीं है कि यह डीबगर की बजाय संकलक समस्या है, लेकिन मुझे नहीं पता कि इससे कैसे निपटना है। मेरा सवालडीबगर संलग्न होने पर ridiculously micro_ptr dtor कॉल धीमा (msvc)

  • क्या यह समस्या आपकी मशीन पर पुन: उत्पन्न करने में सक्षम है?
  • इस व्यवहार का क्या कारण है?
  • कोई वैकल्पिक हल है?
+0

प्रत्येक printf के बाद flushing का प्रयास करें। – Pubby

+0

@ पब्बी: यह कोई फर्क नहीं पड़ता है, केवल 3 'प्रिंटफ का कुल है, प्रत्येक लूप पुनरावृत्ति के लिए नहीं। –

+0

मैं इसे अपने वीएस -2010 एक्सप्रेस संस्करण पर पुन: उत्पन्न करने में सक्षम था। – RedX

उत्तर

6

मंदी की स्मृति स्मृति जांच के कारण होती है जो स्मृति मुक्त होने पर होती है। हालांकि, यह एक विशेष प्रणाली है-/डीबगर-स्तर ढेर, और ऐसा कुछ भी नहीं है जिसे आप अपने प्रोग्राम के भीतर से नियंत्रित कर सकते हैं।

एक great article on the issue नहीं है। संक्षेप में: आपको इसे अक्षम करने के लिए एक पर्यावरण चर सेट करना होगा!

सौभाग्य से, आप अपने प्रोजेक्ट के लिए प्रोजेक्ट सेटिंग्स में डिबगिंग विकल्पों से प्रोजेक्ट-विशिष्ट पर्यावरण चर सेट कर सकते हैं, ताकि पर्यावरण चर केवल आपके प्रोग्राम पर लागू हो।

मैं परीक्षण करने के लिए इस सरल कार्यक्रम का प्रयोग किया: एक वातावरण चर के रूप में स्थापित करने _NO_DEBUG_HEAP=1 (या तो पूरे सिस्टम पर है, जो मैं सिफारिश नहीं होगा, या डिबगिंग विकल्पों के माध्यम से) द्वारा

#include <iostream> 
#include <memory> 
#include <vector> 

int main() 
{ 
    std::cout << "ctor begin" << std::endl; 
    { 
     std::vector<std::unique_ptr<int>> test_vec; 

     for (unsigned i = 0; i < 100000; i++) 
      test_vec.emplace_back(new int); 

     std::cout << "dtor begin" << std::endl; 
    } 
    std::cout << "dtor end" << std::endl; 
} 

, कोड में चलता है डीबगर संलग्न है या नहीं, भले ही लगभग उतना ही समय।

संबंधित मुद्दे