2012-06-20 9 views
6
// <windef.h> 

typedef int     BOOL; 

क्या यह 32 बिट्स के बाद से स्मृति की बर्बादी नहीं है?WinAPI BOOL प्रकार के लिए int (32 बिट्स) का उपयोग क्यों करता है?

बस अगर मैं गलत था, तो मैंने को एक फ़ंक्शन में सामान्य BOOL* भेजने की कोशिश की और जब तक मैंने टाइपपीफ int का उपयोग नहीं किया तब तक काम नहीं किया।

+5

एक समय पर, 'बूल' कोई सी प्रकार नहीं था। देखें http://stackoverflow.com/questions/1608318/is-bool-a-native-c-type – dyp

+1

ओमान मैं बहुत डम हूं मैं असली – y2k

+0

के लिए असली डम हूं, मुझे पता था कि बुल बूल सी में जोड़ा गया था तो होल्डअप क्या है यहां – y2k

उत्तर

17

वाह, थोड़ा धीमा हो गया। सबसे पहले, मुझे यकीन है कि प्रोग्रामर x86 पर प्रोग्रामिंग की शुरुआत के बाद से बूलियन चर के लिए 4-बाइट int एस का उपयोग कर रहे हैं। (bool डेटाटाइप जैसी कोई चीज़ नहीं थी)। और मैं अनुमान लगाता हूं कि यह वही टाइपिफ़ विंडोज 3.1 <Windows.h> में है।

दूसरा, आपको आर्किटेक्चर के बारे में कुछ और समझने की आवश्यकता है। आपके पास 32-बिट मशीन है, जिसका अर्थ है कि सभी सीपीयू रजिस्ट्रार 4-बाइट्स या 32-बिट चौड़े हैं। तो अधिकांश मेमोरी एक्सेस के लिए, यह अधिक कुशल स्टोर करने और 4-बाइट मानों के मुकाबले 4-बाइट मानों तक पहुंचने के लिए है।

यदि आपके पास चार 4-बाइट बुलियन वैरिएबल हैं जो स्मृति के एक 4-बाइट खंड में पैक हैं, उनमें से तीन ड्वॉर्ड (4-बाइट) गठबंधन नहीं हैं। इसका मतलब है कि सीपीयू/मेमोरी कंट्रोलर को वास्तव में और मूल्य प्राप्त करने के लिए काम करना है।

और इससे पहले कि आप "अपमानजनक" टाइपपीफ बनाने के लिए एमएस पर तोड़ने से पहले। इस पर विचार करें: हुड के तहत, अधिकांश संकलक (संभावित रूप से) अभी भीbool डेटाटाइप को 4-बाइट int के समान कारणों से लागू करने के लिए लागू करें। इसे जीसीसी में आज़माएं, और मानचित्र फ़ाइल पर नज़र डालें। मुझे यकीन है कि मैं सही हूँ।

+1

यह, 1 बाइट के साथ संरेखण के मुद्दे मानक आकार रजिस्टर के साथ भयानक हैं। – TheZ

+3

x86 पर, हालांकि, 1 बाइट प्राप्त करना उतना आसान है जितना 4 है। जब आपके पास बहु-बाइट मान होते हैं तो संरेखण समस्याएं खेलती हैं। प्रमुख अक्षमता यह है कि जब आप 1 करेंगे तो आप 4 बाइट पढ़ रहे हैं ... लेकिन किसी भी तरह से यह वही समय लेता है। – cHao

+2

ऐतिहासिक तर्क मान्य है, बाकी नहीं है। जीसीसी 1-बाइट बूल का उत्पादन करता है। 1 बाइट लोडिंग/भंडारण चिप स्तर पर निश्चित रूप से अलग है और 4 बाइट्स लोड करने से कैशिंग, संरेखण और समवर्तीता के लिए अलग-अलग प्रभाव पड़ता है। –

2

प्रोसेसर 32 बिट है, और यह एक विशेष ध्वज है जब यह शून्य पूर्णांक पर चल रहा है, 32 बिट बूलियन मानों के लिए परीक्षण बहुत, बहुत तेज़ है।

1 बिट के लिए परीक्षण, या एक बाइट बूलियन मान कई बार धीमा होने जा रहा है।

यदि आप स्मृति स्थान के बारे में चिंतित हैं, तो आप 4 बाइट बूल चर के बारे में चिंता कर सकते हैं।

अधिकांश प्रोग्रामर प्रदर्शन के बारे में अधिक चिंतित हैं, और इस प्रकार डिफ़ॉल्ट 32 बिट बूल का उपयोग करना डिफ़ॉल्ट है।

यदि आप इससे परेशान हैं तो आप मेमोरी उपयोग के लिए अनुकूलित करने के लिए अपने कंपाइलर को प्राप्त करने में सक्षम हो सकते हैं।

+1

@cHao हां, लेकिन आपको स्मृति से उस बाइट को और अधिक काम करना है। आपको कम से कम 32 बिट्स खींचने और इसे मुखौटा करने की आवश्यकता है। –

+2

और क्या है, इन दिनों अधिकांश x86 CPUs - 32 बिट वाले! - 64 बिट डेटा बसें हैं (इंटेल ने इसे पी 6 के बाद किया है, मुझे विश्वास है ... यहां तक ​​कि मूल पेंटियम भी), ताकि मास्किंग और/या स्थानांतरण * अभी भी * करने की ज़रूरत है। – cHao

13

सबसे पहले, सिस्टम एपीआई में उपयोग किया जाने वाला प्रकार जितना संभव हो उतना भाषा-स्वतंत्र होना चाहिए, क्योंकि उस एपीआई का उपयोग प्रोग्रामिंग भाषाओं की भीड़ द्वारा किया जाएगा। इस कारण से, किसी भी "वैचारिक" प्रकार जो कि कुछ भाषाओं में मौजूद नहीं हो सकते हैं या अन्य भाषाओं में अलग-अलग लागू किए जा सकते हैं, सवाल से बाहर हैं। उदाहरण के लिए, bool उस श्रेणी में फिट बैठता है। उस पर, एक सिस्टम एपीआई में इंटरफ़ेस प्रकारों की संख्या को न्यूनतम रखने के लिए एक बहुत अच्छा विचार है। int द्वारा प्रतिनिधित्व किया जा सकता है कि कुछ भी int द्वारा प्रतिनिधित्व किया जाना चाहिए।

दूसरा, इस बारे में आपका दावा "स्मृति की बर्बादी" होने का कोई अर्थ नहीं है। "स्मृति की बर्बादी" बनने के लिए, एक को कुल डेटा प्रकार बनाना होगा जिसमें BOOL तत्वों की एक बड़ी संख्या शामिल है। विंडोज एपीआई ऐसे डेटा प्रकार का उपयोग नहीं करता है। यदि आपने अपने प्रोग्राम में इस तरह के अपर्याप्त डेटा प्रकार का निर्माण किया है, तो यह वास्तव में आपकी गलती है। इस बीच, विंडोज एपीआई किसी भी तरह से आपके बूलियन मानों को BOOL प्रकार में स्टोर करने के लिए मजबूर नहीं करता है। आप उस उद्देश्य के लिए बाइट्स और यहां तक ​​कि बिट्स का उपयोग कर सकते हैं।दूसरे शब्दों में, BOOL एक पूरी तरह से इंटरफ़ेस प्रकार है। BOOL का ऑब्जेक्ट आमतौर पर किसी भी दीर्घकालिक स्मृति पर कब्जा नहीं करता है, अगर आप इसे सही तरीके से उपयोग कर रहे हैं।

+3

@DyP: वास्तव में नहीं। AFAIK ऐसी मौजूदा भाषाएं हैं जो 1 बाइट प्रकारों का समर्थन नहीं करती हैं क्योंकि उनके पास कोई कारण नहीं है। – AnT

+2

@AndreyT बस सभी डेटाटाइप के बारे में सोचें बीएफ का समर्थन नहीं करता है ... –

+0

मुझे अभी भी वास्तव में जिस तरह से आपने समझाया है उसे पसंद है। हम एक ** एपीआई ** से निपट रहे हैं, डेटा संरचना नहीं। –

2

ऐतिहासिक रूप से BOOL को के रूप में उपयोग किया गया था -0-= TRUE प्रकार। उदाहरण के लिए, एक संवाद प्रक्रिया ने BOOL लौटा दिया, जिसमें बहुत सारी जानकारी हो सकती थी। नीचे हस्ताक्षर Microsoft's own documentation से है:

BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) 

हस्ताक्षर और समारोह परिणाम कई मुद्दों सम्मिश्रण, इसलिए in the modern API यह बजाय

INT_PTR CALLBACK DialogProc(
    _In_ HWND hwndDlg, 
    _In_ UINT uMsg, 
    _In_ WPARAM wParam, 
    _In_ LPARAM lParam 
); 

है यह फै़शनवाला घोषणा पुराने के साथ संगत रहने के लिए है। जिसका अर्थ है कि INT_PTR और BOOL समान आकार होना चाहिए। जिसका मतलब है कि 32-बिट प्रोग्रामिंग में, BOOL 32 बिट्स है।

सामान्यतः, BOOL कोई मूल्य नहीं हो सकता है, न केवल 0 और 1, BOOL से TRUE की तुलना करना बहुत ही अजीब विचार है। और भले ही यह FALSE के खिलाफ तुलना करने के लिए काम करता है, यह आम तौर पर भी खराब अभ्यास है क्योंकि यह आसानी से लोगों को इंप्रेशन दे सकता है कि TRUE के विरुद्ध तुलना करना ठीक रहेगा। इसके अलावा, क्योंकि यह काफी अनावश्यक है।

वैसे, वहाँ Windows API में अधिक बूलियन प्रकार, विशेष रूप से VARIANT_BOOL में जो 16 बिट और जहां तार्किक सही सब 1 bitpattern के रूप में प्रस्तुत किया जाता है, अर्थात -1 एक हस्ताक्षरित मूल्य है & hellip के रूप में ही होता है;

यह एक अतिरिक्त कारण है कि तार्किक FALSE या TRUE के साथ सीधे तुलना करना अच्छा विचार नहीं है।

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