2012-05-09 11 views
7

मैंने कहीं पढ़ा है कि BOOL (typedef int) का उपयोग मानक सी ++ प्रकार बूल का उपयोग करने से बेहतर है क्योंकि BOOL का आकार 4 बाइट्स (यानी 4 का एक बहु) है और यह बचाता है रजिस्टरों में चर के संरेखण संचालन या उन पंक्तियों के साथ कुछ ...प्रदर्शन के लिए C++ BOOL (typedef int) बनाम बूल

क्या इसमें कोई सच है? मैं कल्पना करता हूं कि यदि आप बूल (1 बाइट) का उपयोग करते हैं तो भी कंपाइलर 4s के एकाधिक के संरेखण को रखने के लिए स्टैक फ्रेम को पैड करेगा?

मैं किसी भी तरह से संरेखण, पंजीयक इत्यादि के अंतर्निहित कार्यकलापों पर एक विशेषज्ञ नहीं हूं, इसलिए अगर मुझे यह पूरी तरह से गलत लगता है तो मैं पहले से माफ़ी मांगता हूं। मुझे सही होने की उम्मीद है। :)

चीयर्स!

+6

यदि 'बूल' 4 बाइट्स के रूप में तेज़ है, तो कंपाइलर इसे 4 बाइट बना देगा। यह परिदृश्य पर निर्भर करता है। तो नहीं, 'बूल' प्रदर्शन लाभ नहीं देता है। – tenfour

+0

यह ऐसी चीज है जिसे आप केवल प्रोफाइलिंग के माध्यम से देख सकते हैं, लेकिन क्या आप एक बूल चाहते हैं जिसमें 0,1 के अलावा मूल्य हो सकते हैं? यहां तक ​​कि नकारात्मक मूल्य भी? – juanchopanza

+0

इससे कोई फर्क नहीं पड़ता। कंपाइलर पैड मान यह सुनिश्चित करने के लिए मानते हैं कि वे ठीक से गठबंधन हैं। उस प्रकार का प्रयोग करें जो सबसे ज्यादा समझ में आता है। यदि यह एक बूलियन मान है, तो इसे 'बूल' बनाएं, न कि 'int' (या कुछ 'टाइपिफ़')। –

उत्तर

7

सबसे पहले, sizeof(bool) आवश्यक नहीं है 1। यह implementation-defined है, जो संकलक लेखक को स्वतंत्रता प्लेटफॉर्म के लिए उपयुक्त आकार चुनने की आजादी देता है।

इसके अलावा, sizeof(int) आवश्यक नहीं है 4

कई समस्याएं हैं जिन प्रदर्शन प्रभावित हो सकता है कर रहे हैं:

  • संरेखण;
  • मेमोरी बैंडविड्थ;
  • सीपीयू की मशीन शब्द से संकुचित मूल्यों को कुशलता से लोड करने की क्षमता।

क्या - यदि कोई - अंतर जो कोड के किसी विशेष भाग को बनाता है केवल कोड के उस टुकड़े को प्रोफाइल करके स्थापित किया जा सकता है।

+0

और संकलक शायद इन मुद्दों को दर्शाने के लिए 'बूल' के आकार को अनुकूलित कर चुके हैं। –

+0

आम तौर पर हालांकि बोल रहा है; उदाहरण के लिए कहें कि बूल 1 बाइट है और कहें कि एक int 4 बाइट्स है। मान लें कि आपके पास एक संरचना है {बूल एक्स; int y}; क्या एक्स कारण वाई को मिस-गठबंधन किया जाता है क्योंकि इसका आकार 4 का एक से अधिक नहीं है? या संकलक पैड पते को पैड करता है ताकि y गठबंधन हो? –

+1

@ करलहंससन: पैडिंग कार्यान्वयन-विशिष्ट है। कार्यान्वयन जो मैं परिचित हूं, 'x' के बाद पैडिंग डालेगा ताकि 'y' उपयुक्त रूप से गठबंधन हो। – NPE

2

केवल गारंटी आकार आप सी में प्राप्त कर सकते हैं ++ है char, unsigned char, और signed char2) है, जो हमेशा ठीक एक बाइट और हर मंच के लिए परिभाषित कर रहे हैं के साथ। 0)1)


0) एक बाइट एक परिभाषित आकार नहीं है हालांकि। sizeof(char) हमेशा 1 byte है, लेकिन तथ्य यह है

1) हाँ, वहाँ है uint32_t और दोस्तों, लेकिन नहीं, उनकी परिभाषा वास्तविक सी ++ कार्यान्वयन के लिए वैकल्पिक है में 40 दोहरे बीट्स हो सकता है। उन्हें का प्रयोग करें, लेकिन आप प्राप्त कर सकते हैं समय त्रुटियों संकलन करता है, तो वे उपलब्ध नहीं हैं (संकलन समय त्रुटियों हमेशा अच्छे हैं)

2) char, unsigned char, और signed char अलग प्रकार के होते हैं और यह निर्धारित नहीं है char है कि क्या signed या नहीं। कार्य को ओवरलोड करने और टेम्पलेट लिखने पर इसे ध्यान में रखें।

0

तीन आमतौर पर स्वीकार किया प्रदर्शन पर ही आधारित बूलियन्स के संबंध में प्रथाओं के होते हैं:

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

मैंने कभी भी बूलियन को प्रतिस्थापित करने से किसी भी प्रदर्शन लाभ के बारे में कभी नहीं सुना है (हस्ताक्षरित?) पूर्णांक।

+0

# 3 जरूरी नहीं है। एक परिदृश्य में जहां संरचना में पहले से ही एक अंतर है (संरेखण/ऑटो-पैडिंग के कारण), आप वहां बूल रख कर "मुक्त" के अंतर को "भर सकते हैं"। आइए कहें कि इस स्ट्रक्चर में अब तक एक आकार है जो कैश-लाइन आकार का एकदम सही एकाधिक है, फिर संरचना के अंत में एक बूल जोड़ना (अंतराल भरने के बजाए) वास्तव में कोशिश करते समय कुछ स्थितियों में कैश मिस का कारण बन जाएगा उस बूल सदस्य तक पहुंचने के लिए, (जबकि अन्यथा कोई कैश-मिस नहीं होगा)। आपको स्वतंत्र रूप से प्रत्येक संरचना का न्याय करना चाहिए। –

+0

@PreetKukreti आप सही हैं, मुझे कहना चाहिए था कि 'सामान्य रूप से स्वीकार्य प्रथाओं को अंतर्निहित मंच के ज्ञान की आवश्यकता नहीं होती है'। यदि आप प्लेटफॉर्म को जानते हैं जिस पर एसडब्ल्यू को निष्पादित किया जाना है, तो हाँ, आप संरेखण (4 या 8 या ...) को जान सकते हैं और तदनुसार समायोजित कर सकते हैं - छेद भरें, कैश लाइनों पर संरेखित करें, आदि। मैंने जो सुझाव दिया सूची बूलियन से निपटने के लिए सामान्य नियम थे। –

संबंधित मुद्दे