[C++] सी ++ में बूल में कनवर्ट करने का प्रदर्शन निहितार्थ क्या है?


Answers

प्रदर्शन बोर्ड भर में समान है। इसमें x86 पर कुछ निर्देश शामिल हैं, शायद कुछ अन्य आर्किटेक्चर पर 3।

X86 / VC ++ पर, वे सभी करते हैं

cmp DWORD PTR [whatever], 0
setne al

जीसीसी एक ही चीज़ उत्पन्न करता है, लेकिन चेतावनियों के बिना (किसी भी चेतावनी-स्तर पर)।

Question

[यह सवाल इस से संबंधित है लेकिन इस जैसा नहीं है।]

मेरा कंपाइलर निश्चित रूप से कुछ प्रकारों को बूल करने या कास्टिंग करने के बारे में चेतावनी देता है जबकि स्पष्ट रूपांतरण चेतावनी उत्पन्न नहीं करते हैं:

long t = 0;
bool b = false;
b = t;                    // performance warning: forcing long to bool
b = (bool)t;              // performance warning
b = bool(t);              // performance warning
b = static_cast<bool>(t); // performance warning
b = t ? true : false;     // ok, no warning
b = t != 0;               // ok
b = !!t;                  // ok

यह विजुअल सी ++ 2008 के साथ है, लेकिन मुझे संदेह है कि अन्य कंपाइलर्स की समान चेतावनियां हो सकती हैं।

तो मेरा सवाल है: bool को कास्टिंग / कनवर्ट करने का प्रदर्शन निहितार्थ क्या है? क्या कुछ परिस्थितियों में स्पष्ट रूपांतरण बेहतर प्रदर्शन करता है (उदाहरण के लिए, कुछ लक्षित आर्किटेक्चर या प्रोसेसर के लिए)? क्या किसी भी तरह से अनुकूल रूपांतरण अनुकूलक को भ्रमित करता है?

माइक्रोसॉफ्ट की उनकी चेतावनी का explanation विशेष रूप से सहायक नहीं है। उनका मतलब है कि एक अच्छा कारण है लेकिन वे इसे समझा नहीं देते हैं।




मुझे समयपूर्व अनुकूलन की तरह लगता है। क्या आप उम्मीद कर रहे हैं कि कलाकारों का प्रदर्शन आपके ऐप के प्रदर्शन को गंभीरता से प्रभावित करेगा? हो सकता है कि आप कर्नेल कोड या डिवाइस ड्राइवर लिख रहे हों लेकिन ज्यादातर मामलों में, वे सभी ठीक होना चाहिए।




सी ++ में एक बूल आईएसए int केवल दो मान 0 = झूठी, 1 = सच है। कंपाइलर को केवल एक बिट की जांच करनी है। पूरी तरह से स्पष्ट होने के लिए, सही! = 0, इसलिए कोई भी इंट बूल ओवरराइड कर सकता है, यह केवल ऐसा करने के लिए प्रसंस्करण चक्रों की लागत है।

कोड नमूने के रूप में लंबे समय तक उपयोग करके, आप बहुत अधिक जांच कर रहे हैं, जिससे प्रदर्शन प्रभावित होगा।

नहीं, यह समयपूर्व अनुकूलन नहीं है, यह कोड का उपयोग करने में काफी पागल है जो बोर्ड में अधिक प्रसंस्करण समय लेता है। यह बस अच्छा कोडिंग अभ्यास है।




माइक्रोसॉफ्ट की व्याख्या यह प्रतीत होती है कि वे क्या कहने की कोशिश कर रहे हैं:

अरे, अगर आप एक इंट का उपयोग कर रहे हैं, लेकिन केवल इसमें सच्ची या झूठी जानकारी संग्रहित कर रहे हैं, तो इसे एक बूल बनाएं!

मुझे इस बात पर संदेह है कि प्रदर्शन-वार कितना हासिल किया जाएगा, लेकिन एमएस ने पाया होगा कि कुछ लाभ (उनके उपयोग के लिए, वैसे भी) था। माइक्रोसॉफ्ट का कोड बहुत भयानक दौड़ता है, इसलिए शायद उन्हें सूक्ष्म अनुकूलन सार्थक साबित हुआ है। मेरा मानना ​​है कि एमएस कंपाइलर में जो कुछ भी जाता है वह उन चीजों का समर्थन करना है जो उन्हें स्वयं उपयोगी पाते हैं (केवल समझ में आता है, है ना?)।

और आप बूट करने के लिए कुछ गंदे, छोटे जानवरों से छुटकारा पाएं।




long t;
bool b;
int i;
signed char c;
...

जब आप कुछ भी करते हैं तो आपको चेतावनी मिलती है जो "मुक्त" होगा यदि बूल को 0 या 1 होना आवश्यक नहीं था। बी = !! टी प्रभावी रूप से (भाषा निर्मित, गैर-ओवरराइड करने योग्य) bool operator!(long) का परिणाम असाइन कर रहा है bool operator!(long)

आपको उम्मीद नहीं करनी चाहिए! या! = ऑपरेटरों को एक अनुकूल कंपेलर के साथ भी शून्य एएसएम निर्देशों की लागत। यह आमतौर पर सच है कि int i = t आमतौर पर पूरी तरह से अनुकूलित किया जाता है। या यहां तक ​​कि हस्ताक्षर चार सी = टी; (x86 / amd64 पर, यदि टी% eax रजिस्टर में है, सी = टी के बाद, सी का उपयोग करने का मतलब है% al। amd64 का उपयोग प्रत्येक रजिस्टर के लिए बाइट एड्रेसिंग है, बीटीडब्लू। आईआईआरसी, x86 में कुछ रजिस्टरों में बाइट एड्रेसिंग नहीं है ।)

वैसे भी, b = t; i = b ; isn't the same as c = t; i = c; it's i = !!t; instead of i = t & 0xff b = t; i = b ; isn't the same as c = t; i = c; it's i = !!t; instead of i = t & 0xff b = t; i = b ; isn't the same as c = t; i = c; it's i = !!t; instead of i = t & 0xff ;

एर, मुझे लगता है कि हर कोई पहले से ही पिछले उत्तरों से जानता है। मेरा मुद्दा था, चेतावनी मुझे समझ में आया, क्योंकि यह उन मामलों को पकड़ा गया जहां संकलक को उन चीजों को करना था जिन्हें आपने वास्तव में नहीं बताया था! जैसे बदले में बूल क्योंकि आपने फ़ंक्शन बूल घोषित किया था, लेकिन एक अभिन्न मूल्य लौटा रहे हैं यह सच हो सकता है और! = 1. उदाहरण के लिए बहुत सारी खिड़कियां सामान (int) लौटाती हैं।

यह एमएसवीसी की कुछ चेतावनियों में से एक है कि जी ++ में नहीं है। मैं g ++ के लिए बहुत अधिक उपयोग कर रहा हूं, और यह निश्चित रूप से एमएसवीसी की सामग्री के बारे में चेतावनी देता है, लेकिन मुझे खुशी है कि उसने मुझे बताया। मैंने एमएफसी / विन 32 कक्षाओं / मैक्रोज़ / फ़ंक्शंस के लिए स्टब्स के साथ एक portab.h हेडर फ़ाइल लिखा था। यह एमएफसी ऐप मिला है जिसे मैं घर पर अपने जीएनयू / लिनक्स मशीन पर संकलित करने के लिए काम कर रहा हूं (और साइगविन के साथ)। मैं मुख्य रूप से घर पर काम कर रहा था कि संकलन-परीक्षण करने में सक्षम होना चाहता था, लेकिन मैं g ++ की चेतावनियों को बहुत उपयोगी पाया। यह टेम्पलेट्स के बारे में भी बहुत कठोर है ...

सामान्य रूप से बूल पर, मुझे यकीन नहीं है कि यह बेहतर कोड के लिए बनाता है जब रिटर्न मान और पैरामीटर पासिंग के रूप में उपयोग किया जाता है। यहां तक ​​कि स्थानीय लोगों के लिए, g ++ 4.3 यह समझ में नहीं आता है कि इसे उस पर ब्रांच करने से पहले 0 या 1 मान को मजबूर नहीं करना पड़ता है। यदि यह एक स्थानीय चर है और आप इसका पता कभी नहीं लेते हैं, तो संकलक को इसे किसी भी आकार में सबसे तेज़ रखना चाहिए। यदि इसे रजिस्टरों से स्टैक तक फैलाना है, तो यह इसे 4 बाइट्स में भी रख सकता है, क्योंकि यह थोड़ा तेज़ हो सकता है। (लोड / भंडारण (गैर-स्थानीय) बूल लोड करते समय यह बहुत सारे movsx (साइन-एक्सटेंशन) निर्देशों का उपयोग करता है, लेकिन मुझे वास्तव में याद नहीं है कि यह स्वचालित (स्थानीय स्टैक) चर के लिए क्या किया गया है। मुझे याद है कि यह एक अजीब आरक्षित है कुछ बूल स्थानीय लोगों के कार्यों में स्टैक स्पेस (4 का एक से अधिक नहीं) की मात्रा।)

पिछले साल के रूप में डिजिटल मंगल डी कंपाइलर के साथ बूल झंडे का उपयोग करना धीमा था: http://www.digitalmars.com/d/archives/digitalmars/D/opEquals_needs_to_return_bool_71813.html (डी सी ++ की तरह बहुत है, लेकिन पूर्ण छोड़ दिया गया है कुछ अच्छे नए अर्थशास्त्र को परिभाषित करने के लिए सी बैकवर्ड कॉम्पैट, और टेम्पलेट मेटाप्रोग्रामिंग के लिए अच्छा समर्थन। उदाहरण के लिए टेम्पलेट हैक्स या सीपीपी मैक्रोज़ के बजाय "स्थैतिक अगर" या "स्थैतिक जोर दें"। मैं वास्तव में डी को कुछ कोशिश करना चाहता हूं। :)

डेटा संरचनाओं के लिए, यह समझ में आ सकता है, उदाहरण के लिए यदि आप एक int से पहले कुछ झंडे पैक करना चाहते हैं और फिर एक स्ट्रक्चर में कुछ युगल आप बहुत अधिक होने जा रहे हैं।




Links