2015-01-01 4 views
7

मैं Bjarne Stroustrup की बात "The Essential C++" देख रहा था।सी ++ 11: इसका जीसी इंटरफेस क्या है, और कैसे कार्यान्वित किया जाए?

44:26 में उन्होंने उल्लेख किया है "सी ++ 11 एक जीसी इंटरफ़ेस निर्दिष्ट करता है"।

मैं पूछ सकता है इंटरफेस है क्या, और यह कैसे लागू करने के लिए? कोई और विस्तृत अच्छा परिचय ऑनलाइन, या कुछ नमूना कोड इसे प्रदर्शित करने के लिए pls?

उत्तर

8

Stroustrup उसकी C++ FAQ में इस चर्चा फैली हुई है, बात यह है कि जी सी उपयोग वैकल्पिक है है, पुस्तकालय विक्रेताओं में से एक या नहीं लागू करने के लिए स्वतंत्र हैं:

कचरा संग्रहण ( स्मृति के unreferenced क्षेत्रों का स्वत: रीसाइक्लिंग) है वैकल्पिक सी ++ में; यानी, एक कचरा कलेक्टर कार्यान्वयन का अनिवार्य हिस्सा नहीं है। हालांकि, सी ++ 11 क्या हुआ अगर एक प्रयोग किया जाता है और एक ABI (अनुप्रयोग बाइनरी इंटरफ़ेस) मदद करने के लिए उसके कार्यों को नियंत्रित एक जीसी कर सकते हैं की एक परिभाषा प्रदान करता है।

पॉइंटर्स और जीवनकाल के नियम "सुरक्षित व्युत्पन्न सूचक" (3.7.4.3) के संदर्भ में व्यक्त किए जाते हैं; मोटे तौर पर: "कुछ को पॉइंटर को नए या उप-ऑब्जेक्ट द्वारा आवंटित किया गया।" साधारण मनुष्यों को : [...]

सी में कार्यों ++ मानक इस ("इंटरफेस" जो Stroustrup लिए बात कर रहा है करने के लिए कर रहे हैं) का समर्थन:

,210

इन कार्यों the N2670 proposal में प्रस्तुत कर रहे हैं:

इसका उद्देश्य दोनों कचरा एकत्र कार्यान्वयन और गम्यता आधारित रिसाव डिटेक्टरों समर्थन करने के लिए है। यह अनिर्धारित उन कार्यक्रमों के व्यवहार को करता है जो "पॉइंटर छुपाएं" उदाहरण के लिए, को अन्य मान के साथ xor-ing करें, और उसके बाद इसे वापस सामान्य पॉइंटर में बदलें और इसे कम करें। इस तरह के कार्यक्रम वर्तमान में उत्पादन हो सकता है रूढ़िवादी कचरा कलेक्टरों के साथ गलत परिणाम, एक वस्तु इस तरह के एक "छिपा सूचक" द्वारा केवल संदर्भित समय से पहले ही एकत्र हो सकता है के बाद से। उसी कारण से, गम्यता आधारित रिसाव डिटेक्टरों ग़लती से रिपोर्ट कर सकते हैं कि इस तरह के कार्यक्रमों स्मृति रिसाव।

या तो अपने कार्यान्वयन "सख्त सूचक सुरक्षा" जिस स्थिति में एक जीसी को लागू करने के लिए संभव है का समर्थन करता है, या यह एक "आराम सूचक सुरक्षा" (डिफ़ॉल्ट रूप से) है, जो मामले में यह नहीं है। यदि आप उपलब्ध हैं, तो आप std::get_pointer_safety() के परिणाम देखकर निर्धारित कर सकते हैं।

मुझे किसी भी वास्तविक मानक सी ++ जीसी कार्यान्वयन के बारे में पता नहीं है, लेकिन कम से कम मानक होने के लिए जमीन तैयार कर रहा है।

6

quantdev द्वारा अच्छे उत्तर के अलावा, जो मैंने ऊपर उठाया है, मैं यहां थोड़ी अधिक जानकारी प्रदान करना चाहता था (जो किसी टिप्पणी में फिट नहीं होगा)।

यहाँ एक सी ++ 11 अनुरूप प्रोग्राम है जो यह दर्शाता है एक कार्यान्वयन जीसी इंटरफ़ेस का समर्थन करता है या नहीं है:

#include <iostream> 
#include <memory> 

int 
main() 
{ 
#ifdef __STDCPP_STRICT_POINTER_SAFETY__ 
    std::cout << __STDCPP_STRICT_POINTER_SAFETY__ << '\n'; 
#endif 
    switch (std::get_pointer_safety()) 
    { 
    case std::pointer_safety::relaxed: 
     std::cout << "relaxed\n"; 
     break; 
    case std::pointer_safety::preferred: 
     std::cout << "preferred\n"; 
     break; 
    case std::pointer_safety::strict: 
     std::cout << "strict\n"; 
     break; 
    } 
} 

का एक उत्पादन:

relaxed 

का मतलब कार्यान्वयन एक छोटी सी है कि कार्यान्वयन जो कुछ भी नहीं करता है।

libC++ आउटपुट:

relaxed 

वी.एस. 2015 के आउटपुट:

relaxed 

जीसीसी 5.0 आउटपुट:

prog.cc: In function 'int main()': 
prog.cc:10:13: error: 'get_pointer_safety' is not a member of 'std' 
    switch (std::get_pointer_safety()) 
      ^
संबंधित मुद्दे