[C++] C ++ में bool को परिवर्तित करने का प्रदर्शन निहितार्थ क्या है?


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 को परिवर्तित करने का प्रदर्शन क्या है? कुछ परिस्थितियों में स्पष्ट रूपांतरण का बेहतर प्रदर्शन होता है (उदाहरण के लिए, कुछ निश्चित आर्किटेक्चर या प्रोसेसर के लिए)? अंतर्निहित रूपांतरण किसी तरह अनुकूलक को भ्रमित करता है?

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




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

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

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




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

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

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

और आप कुछ गंदे, छोटे से डाटों से छुटकारा पा सकते हैं।




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




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

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

आपको उम्मीद नहीं करनी चाहिए! या! = ऑपरेटर्स को अनुकूलन कंपाइलर के साथ भी शून्य एएमएम निर्देशों का खर्च यह आमतौर पर सच है कि int i = t आमतौर पर पूरी तरह से दूर अनुकूलित है या यहां तक ​​कि सीआर सी = टी पर हस्ताक्षर किए; (x86 / amd64 पर, यदि टी% eax रजिस्टर में है, c = t के बाद, c का प्रयोग करके c। का उपयोग करने का मतलब है। 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 ;

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

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

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

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

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