सबसे पहले, अंगूठे के कुछ नियम:
std::unique_ptr
नो-ओवरहेड स्मार्ट पॉइंटर के रूप में उपयोग करें । आपको अक्सर कच्चे पॉइंटर्स से परेशान होने की ज़रूरत नहीं है। std::shared_ptr
इसी तरह ज्यादातर मामलों में अनावश्यक है। साझा स्वामित्व की इच्छा अक्सर पहली जगह में स्वामित्व के बारे में विचार की कमी को धोखा देती है।
std::array
स्थैतिक-लंबाई सरणियों के लिए और std::vector
गतिशील के लिए उपयोग करें ।
विशेष रूप से बड़े पैमाने पर जेनेरिक एल्गोरिदम का उपयोग करें:
<algorithm>
<numeric>
<iterator>
<functional>
उपयोग auto
और decltype()
जहाँ भी वे पठनीयता का लाभ उठाते हैं। विशेष रूप से, जब आप किसी चीज़ को घोषित करना चाहते हैं, लेकिन एक प्रकार का जिसे आप इस बारे में परवाह नहीं करते हैं जैसे कि एक इटरेटर या जटिल टेम्पलेट प्रकार, उपयोग auto
। जब आप किसी चीज को दूसरी चीज के प्रकार के संदर्भ में घोषित करना चाहते हैं, तो उपयोग करें decltype()
।
जब आप कर सकते हैं चीजों को सुरक्षित रखें। जब आपके पास एक विशेष प्रकार की चीज़ पर आक्रमण करने वालों को लागू करने के दावे हैं, तो उस तर्क को एक प्रकार में केंद्रीकृत किया जा सकता है। और यह जरूरी नहीं कि किसी रनटाइम ओवरहेड के लिए बना हो। यह भी कहे बिना जाना चाहिए कि C- शैली की जातियों ( (T)x
) को अधिक स्पष्ट (और खोज योग्य!) C ++ - शैली की जातियों (जैसे, static_cast
) के पक्ष में टाला जाना चाहिए ।
अंत में, जानिए कैसे तीन का नियम:
- नाशक
- कंस्ट्रक्टर को कॉपी करें
- असाइनमेंट ऑपरेटर
मूव कंस्ट्रक्टर और मूव असाइनमेंट ऑपरेटर को जोड़ने के साथ पांच का नियम बन गया है। और सामान्य रूप से संदर्भों को समझें और नकल से कैसे बचें।
तो यह कैसे सबसे अच्छा उपयोग करने के लिए चिह्नित करने के लिए मुश्किल है सी ++, एक जटिल भाषा है सब इसके बारे में। लेकिन अच्छे C ++ विकास की प्रथाओं को C ++ 11 के साथ मौलिक रूप से नहीं बदला है। आपको अभी भी मैन्युअल मेमोरी प्रबंधन पर मेमोरी-प्रबंधित कंटेनरों को प्राथमिकता देना चाहिए - स्मार्ट पॉइंटर्स कुशलतापूर्वक ऐसा करना आसान बनाते हैं।
मैं कहूंगा कि आधुनिक C ++ वास्तव में मैन्युअल मेमोरी प्रबंधन से मुक्त है - C ++ के मेमोरी मॉडल का लाभ यह है कि यह नियतात्मक है , न कि यह मैनुअल है। भविष्य कहनेवाला प्रदर्शन अधिक पूर्वानुमान प्रदर्शन के लिए बनाते हैं।
संकलक के रूप में, G ++ और Clang दोनों C ++ 11 सुविधाओं के संदर्भ में प्रतिस्पर्धी हैं, और तेजी से अपनी कमियों को पकड़ रहे हैं। मैं विज़ुअल स्टूडियो का उपयोग नहीं करता, इसलिए मैं न तो इसके लिए बोल सकता हूं और न ही इसके खिलाफ।
अंत में, एक नोट के बारे में std::for_each
: इसे सामान्य रूप से बचें।
transform
, accumulate
, और erase
- remove_if
अच्छे पुराने कार्य कर रहे हैं map
, fold
और filter
। लेकिन for_each
यह अधिक सामान्य है, और इसलिए कम सार्थक है - यह लूपिंग के अलावा किसी भी इरादे को व्यक्त नहीं करता है । इसके अलावा, यह रेंज-आधारित के रूप में समान स्थितियों में उपयोग किया जाता है for
, और पॉइंट-फ़्री होने पर भी सिंटैक्टिक रूप से भारी होता है। विचार करें:
for (const auto i : container)
std::cout << i << '\n';
std::for_each(container.begin(), container.end(), [](int i) {
std::cout << i << '\n';
});
for (const auto i : container)
frobnicate(i);
std::for_each(container.begin(), container.end(), frobnicate);