तार्किक (गैर-तकनीकी) दृष्टिकोण से, कोई फायदा नहीं है।
किसी भी सादे C / C ++ कोड को उपयुक्त "लाइब्रेरी कंस्ट्रक्शन" के भीतर लपेटा जा सकता है। इस तरह के रैपिंग के बाद, "क्या यह उस से अधिक लाभप्रद है" का मामला एक मूक सवाल बन जाता है।
स्पीड-पॉइंट-ऑफ-व्यू से, C / C ++ को लाइब्रेरी कंस्ट्रक्शन को कोड उत्पन्न करने की अनुमति देनी चाहिए जो उस सादे कोड के रूप में कुशल है जो कि रैप करता है। हालांकि यह निम्न है:
- फंक्शन इनलाइनिंग
- कंपाइल-टाइम चेकिंग और अनावश्यक रनटाइम चेकिंग को खत्म करना
- मृत कोड उन्मूलन
- कई अन्य कोड अनुकूलन ...
इस तरह के गैर-तकनीकी तर्क का उपयोग करके, किसी भी "लापता कार्यों" को किसी के द्वारा जोड़ा जा सकता है, और इसलिए इसे नुकसान के रूप में नहीं गिना जाता है।
हालाँकि, अतिरिक्त कोड के साथ अंतर्निहित आवश्यकताओं और सीमाओं को दूर नहीं किया जा सकता है। नीचे, मैं तर्क देता हूं कि इसका आकार std::bitset
एक संकलन-समय स्थिर है, और इसलिए इसे नुकसान के रूप में नहीं गिना जाता है, फिर भी यह कुछ ऐसा है जो उपयोगकर्ता की पसंद को प्रभावित करता है।
सौंदर्य की दृष्टि से (पठनीयता, रखरखाव में आसानी आदि), एक अंतर है।
हालाँकि, यह स्पष्ट नहीं है कि std::bitset
कोड तुरंत सी कोड पर जीत जाता है। किसी को कोड के बड़े टुकड़ों (और कुछ खिलौना-नमूना) को देखने के लिए कहना होगा कि क्या std::bitset
स्रोत कोड के मानव गुणवत्ता में सुधार हुआ है।
बिट हेरफेर की गति कोडिंग शैली पर निर्भर करती है। कोडिंग शैली C / C ++ बिट हेरफेर दोनों को प्रभावित करती है, और समान std::bitset
रूप से अच्छी तरह से लागू होती है , जैसा कि समझाया गया है।
यदि कोई एक कोड लिखता है जो operator []
एक बार में एक बिट पढ़ने और लिखने के लिए उपयोग करता है , तो किसी को एक से अधिक बिट्स में हेरफेर करने के लिए कई बार ऐसा करना होगा। वही सी-स्टाइल कोड के बारे में कहा जा सकता है।
हालांकि, bitset
इस तरह के रूप में अन्य ऑपरेटरों, है operator &=
, operator <<=
आदि, जो bitset की पूरी चौड़ाई पर चल रही है। क्योंकि अंतर्निहित मशीनरी अक्सर 32-बिट, 64-बिट और कभी-कभी 128-बिट (SIMD के साथ) एक समय में (सीपीयू चक्रों की समान संख्या में) काम कर सकती है, ऐसे कोड जो इस तरह के मल्टी-बिट ऑपरेशन का लाभ उठाने के लिए डिज़ाइन किए गए हैं "लोपी" बिट-हेरफेर कोड की तुलना में तेज़ हो सकता है।
सामान्य विचार को SWAR (एक रजिस्टर के भीतर SIMD) कहा जाता है , और बिट जोड़तोड़ के तहत एक उपपट्टी है।
कुछ C ++ विक्रेता bitset
64-बिट और 128-बिट के बीच SIMD के साथ कार्यान्वित कर सकते हैं । कुछ विक्रेता (लेकिन अंततः ऐसा नहीं कर सकते हैं)। यदि यह जानने की आवश्यकता है कि C ++ विक्रेता की लाइब्रेरी क्या कर रही है, तो एक ही तरीका यह है कि डिससैसम को देखें।
जैसे कि std::bitset
सीमाएं हैं, मैं दो उदाहरण दे सकता हूं।
std::bitset
संकलन समय पर आकार ज्ञात होना चाहिए। गतिशील रूप से चुने गए आकार के साथ बिट्स की एक सरणी बनाने के लिए, एक का उपयोग करना होगा std::vector<bool>
।
- वर्तमान C ++ विनिर्देशन के लिए M बिट्स के
std::bitset
एक बड़े bitset
भाग से N बिट्स के लगातार स्लाइस को निकालने का तरीका प्रदान नहीं करता है ।
पहला एक मौलिक है, जिसका अर्थ है कि जिन लोगों को गतिशील रूप से बिटसेट्स की आवश्यकता होती है, उन्हें अन्य विकल्पों को चुनना होगा।
दूसरे को दूर किया जा सकता है, क्योंकि कोई कार्य करने के लिए कुछ प्रकार के एडेप्टर लिख सकता है , भले ही मानक bitset
एक्स्टेंसिबल न हो।
कुछ विशेष प्रकार के उन्नत SWAR ऑपरेशन हैं, जिन्हें आउट-ऑफ-द-बॉक्स प्रदान नहीं किया जाता है std::bitset
। एक बिट परमिट के बारे में इस वेबसाइट पर इन कार्यों के बारे में पढ़ सकता है । हमेशा की तरह, कोई भी अपने दम पर इन्हें लागू कर सकता है, शीर्ष पर परिचालन कर रहा है std::bitset
।
प्रदर्शन पर चर्चा के बारे में।
एक चेतावनी: बहुत से लोग मानक पुस्तकालय से क्यों (कुछ) के बारे में पूछते हैं , कुछ सरल सी-स्टाइल कोड की तुलना में बहुत धीमा है। मैं यहाँ माइक्रोबेनमार्किंग के पूर्व ज्ञान को नहीं दोहराऊंगा, लेकिन मेरे पास बस यही सलाह है: "रिलीज़ मोड" में बेंचमार्क सुनिश्चित करें (अनुकूलन सक्षम होने के साथ), और सुनिश्चित करें कि कोड को समाप्त नहीं किया जा रहा है (मृत कोड उन्मूलन) या जा रहा है लूप से बाहर फहराया गया (लूप-इनवेरेंट कोड मोशन) ।
चूँकि सामान्य तौर पर हम यह नहीं बता सकते हैं कि कोई व्यक्ति (इंटरनेट पर) सही तरीके से माइक्रोबैनचर्च कर रहा था या नहीं, एक ही तरीका है कि हम एक विश्वसनीय निष्कर्ष प्राप्त कर सकें, अपने स्वयं के माइक्रोबैनचर्च करने के लिए, और विवरणों का दस्तावेजीकरण करें, और सार्वजनिक समीक्षा और समालोचना प्रस्तुत करें। यह माइक्रोबेनचर्च को फिर से करने के लिए चोट नहीं करता है जो दूसरों ने पहले किया है।
std::bitset
का आकार संकलन-समय पर तय किया गया है। यही एकमात्र अपंगता है जिसके बारे में मैं सोच सकता हूं।