2010-06-30 9 views
6

इनमें से कौन सा बेहतर है?एक int वापस या एक int सूचक प्राप्त करें - क्या बेहतर है?

void SetBit(int *flag, int bit) 
{ 
    *flag |= 1 << bit; 
} 

या

int SetBit(int flag, int bit) 
{ 
    flag |= 1 << bit; 
    return flag; 
} 
+1

व्यक्तिगत रूप से, मुझे लगता है कि बुलियन ध्वज के रूप में पूरे int (या char या short या जो भी) का उपयोग करना सबसे अच्छा है। निश्चित रूप से यह अधिक स्मृति का उपयोग करता है लेकिन यह बहुत अधिक पठनीय है। जब तक स्मृति एक गंभीर प्रतिबंध नहीं है, तब तक जब आप कर सकते हैं तो बिट-हैक्स से बचें। – corsiKa

+0

नीचे वोट क्यों? – Polaris878

+0

@ छात्रवृत्ति: मेरा अनुमान यह होगा कि लोग सोच रहे थे कि यह एक प्रदर्शन प्रश्न था (मैं इसे लगभग कुछ बार फिर से पढ़ने से पहले उस कारण के लिए डाउनवॉटेड ...) –

उत्तर

7

मैं एक दूसरे की तरह है, क्योंकि यह कोई साइड इफेक्ट भी नहीं है। न तो

flag = SetBit(flag, 4); 
6

: आप flag संशोधित करना चाहते हैं, तो आप बस परिणाम खुद के लिए प्रदान कर सकते हैं।

int SetBit(int flag, int bit) 
{ 
    return flag | 1 << bit; 
} 
+0

निश्चित रूप से यह। यदि आपके पास वास्तव में कोई अच्छा कारण नहीं है तो पैरामीटर चर में खुदाई न करें। संशोधित मान लौटाएं और उपयोगकर्ता को इसे वैरिएबल में वापस असाइन करने दें यदि उन्हें पसंद है। –

+5

आपको नहीं लगता कि संकलक शायद वैसे भी इसे अनुकूलित कर देगा? –

+0

@ प्लैटिनम: यह एक प्रदर्शन की बात नहीं है, यह एक पठनीयता की बात है। –

1

मैं दूसरा एक बेहतर ...

चाहते हालांकि, मैं अपने फ़ंक्शन का नाम बदलने की सलाह देते हैं (यह मानते हुए वास्तविक नाम है) और वर्णनात्मक किया जाना है। "SetBit" यह वर्णन करने के लिए बहुत कुछ नहीं करता है कि फ़ंक्शन क्या करता है या देता है :)

+0

में संदर्भ चर नहीं है? ऐसा लगता है कि मुझे समझ में आता है - यह दिए गए ध्वज चर में थोड़ा सेट करता है। –

+1

वास्तव में मैं असहमत हूं - फ़ंक्शन थोड़ा सेट करता है। फ़ंक्शन का उपयोग किसी भी संदर्भ में किया जा सकता है जहां थोड़ा सेट होना चाहिए। – corsiKa

+0

क्या "बिट" सेट करता है? – Polaris878

5

यह निर्भर करता है।

पहला एक अनिवार्य शैली है, दूसरा एक कार्यात्मक शैली है।

आपको बस इतना करना

SetBit(SetBit(... SetBit(flag, b1), b2),...), bn) 

दूसरा कोई एक कार्य करें चाहते हैं। यदि आप

SetBit(&flag, b1) 
SetBit(&flag, b2) 
... 
SetBit(&flag, bn) 

पहले व्यक्ति को करना चाहते हैं। सी में, मैं बाद वाले को पसंद करूंगा (यानी अनिवार्य)। अन्य भाषाओं/संदर्भों में, पूर्व एक अच्छा विचार हो सकता है।

+0

कार्यात्मक शैली का एक खराब उपयोग (गहरा घोंसले कार्य) इससे बचने का बहाना नहीं है। यदि आप उन्हें अलग-अलग लाइनों पर सूचीबद्ध करना चाहते हैं तो आप सेटबिट के परिणाम को प्रत्येक पंक्ति पर ध्वज चर के लिए असाइन कर सकते हैं। –

+0

क्या आप गंभीरता से वास्तव में सी में उस पहले पैटर्न का उपयोग करने की सलाह देंगे? (कोई डाउनवोट नहीं है, लेकिन मुझे यह सब कुछ उल्लेख करने पर सवाल करना है क्योंकि यह लगभग अपठनीय होगा!) –

+0

@ प्लैटिनम मैं निश्चित रूप से नहीं जानता, लेकिन मैं यहां कार्यात्मक निर्माण के लिए एक अच्छा और तत्काल औचित्य नहीं सोच सकता था। –

1

यह निर्भर करता है।

उस स्थिति में, वास्तव में कोई भी तरीका वास्तव में काम करेगा। लेकिन मैं दो विशेष मामलों के बारे में सोच सकता हूं जहां मैं एक सूचक का उपयोग करने का पक्ष लेगा।

  1. यदि आप जिस प्रकार में गुजर रहे हैं वह बड़ा है और मूल्य प्रति महंगा होगा, प्रदर्शन कारणों के लिए एक सूचक का उपयोग करें।

  2. यदि आपको कुछ और वापस करने की आवश्यकता है, तो शायद एक स्टेटस कोड या सफलता/विफलता संकेत, तो आपको सूचक का उपयोग करने की आवश्यकता है ताकि आप लौटने के लिए आवश्यक मूल्य वापस करने के लिए कमरे छोड़ सकें।

मैं व्यक्तिगत रूप से सोचता हूं कि उन स्थितियों के बाहर, दूसरा (मूल्य द्वारा पास/वापसी) स्पष्ट और थोड़ा अधिक पठनीय है।

1

दूसरा बेहतर है क्योंकि यह क्रैश नहीं होगा।

पहले एक अगर आप एक शून्य अमान्य सूचक में पारित दुर्घटना सकता है जाएगा, ताकि आप की जाँच करें और है कि संभाल करने के लिए कुछ कोड होना चाहिए था।

0

पॉइंटर को समय-समय पर सहेजने के लिए int पास करें।

+0

यह फ़ंक्शन किसी भी उचित कंपाइलर द्वारा किसी भी तरह से रेखांकित किया जा रहा है - - मैं यहां प्रदर्शन के बारे में चिंता नहीं करता। –

+0

खासकर एम्बेडेड सिस्टम दुनिया में, सभी कंपाइलर ऐसी चीजों को रेखांकित नहीं करेंगे। इसके अलावा, पैटर्न कई मामलों में उत्पन्न होता है जहां कोड पर्याप्त जटिल है जो इसे रेखांकित करना अव्यवहारिक होगा। मेरी व्याख्या के अनुसार, सवाल यह नहीं था कि उसे एक चर में बिट्स कैसे सेट करना चाहिए, लेकिन कोडिंग के किस पैटर्न के बारे में बेहतर था। – supercat

5

मैं एक मैक्रो का प्रयोग करेंगे:

#define BIT_SET(a, bit) ((a) | (1 << (bit))) 
+2

क्यों नहीं, लेकिन मैं अभी भी इसे SET_BIT नाम दूंगा;) –

+3

+1 मैं मैक्रो का भी उपयोग करता हूं –

+2

+1 निश्चित रूप से एक मैक्रो (ऐसे मामलों में एक फ़ंक्शन कॉल महंगा है) – INS

5

ईमानदारी से कहूं तो मैं यह सिर्फ झंडे के रूप में "जादू संख्या" का उपयोग करने के लिए प्रोत्साहित करती है लगता है:

SetBit(&flags, 12); // 12 is the flag for Super mode 

क्या आप वास्तव में चाहते हैं स्थिरांक का नाम है :

#define SUPERMODE_FLAG 12 
... 
SetBit(&flags, SUPERMODE_FLAG); 

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

#define SUPERMODE_MASK (1 << 12) 
.... 
flags |= SUPERMODE_MASK; 

असामान्य मामला है कि आप संख्या से अलग-अलग बिट्स जोड़ तोड़ कर रहे हैं में, तो मैं दूसरे को पसंद करते हैं क्रिस्टो के समान कारण के लिए - मुझे साइड-इफेक्ट-फ्री फ़ंक्शंस म्यूटेटर की तुलना में थोड़ा आसान लगता है।

0

यदि कार्य को रेखांकित किया जा रहा है तो सबसे पहले ठीक है। इनलाइनों के चारों ओर पॉइंटर्स को पास करने के लिए थोड़ा अधिक ओवरहेड डालने के बिना। (64 बिट एलपी 64 आर्क पर, int 4 बाइट्स है, पॉइंटर 8 है)

दूसरा ... फ़ंक्शन नाम सेटबिट() कुछ मामूली भ्रम पैदा करने जा रहा है। नाम का तात्पर्य है कि फ़ंक्शन कुछ बदलता है जबकि वास्तव में यह नहीं करता है। जब तक आप नाम के साथ ठीक हो, तब तक यह प्रदर्शन-वार एक बेहतर विकल्प है।

उदा। लिनक्स कर्नेल पॉइंटर संस्करण जैसी कई समान चीजों के लिए उपयोग करता है, क्योंकि अक्सर डेटाम की स्मृति स्थान पोर्टेबिलिटी के लिए महत्वपूर्ण या आवश्यक है। लेकिन वे या तो ऐसे सभी कार्यों को प्रीप्रोसेसर मैक्रो बनाते हैं या जीसीसी की हमेशा_इनलाइन विशेषता के साथ चिह्नित करते हैं। उपयोगकर्ता-भूमि, सादा अनुप्रयोग प्रोग्रामिंग के लिए, मैं कहूंगा कि दूसरे को प्राथमिकता दी जानी चाहिए। केवल एक बेहतर नाम चुनें।

0

यदि फ़ंक्शन का उपयोग करने का एकमात्र पैटर्न "variable = doSomething (variable) होगा;" और प्रदर्शन कोई मुद्दा नहीं है, मैं "डूसमिंग (& परिवर्तनीय) पर विचार करता हूं;" अधिक सुगम होने के लिए। एकमात्र बार जब मैं पूर्व का पक्ष लेता हूं तो यह होगा कि गंतव्य कभी-कभी स्रोत के अलावा कुछ और था, या यदि प्रदर्शन महत्वपूर्ण था और किसी का कंपाइलर बाद वाले मामले (एम्बेडेड सिस्टम पर आम) को कुशलतापूर्वक संभाल नहीं सकता था।

यह ध्यान दिया जाना चाहिए कि बाद वाला प्रारूप पूर्व की अनुमति देता है। वीबी शैली में:

 
Sub OrBits(ByRef N as Integer, ByVal Bits as Integer) 
    Dim OldValue as Integer 
    Do 
    OldValue = N 
    Loop While Threading.Interlocked.CompareExchange(N, OldValue or Bits, OldValue) <> OldValue 
End Sub 

इस कोड का प्रभाव हमेशा एन में या निर्दिष्ट बिट्स के लिए किया जाएगा, कुछ बदल जाता है एन जबकि समारोह चल रहा है, भले ही। रीड-एंड-रिटर्न रणनीति के साथ इस तरह के व्यवहार को हासिल करना संभव नहीं है।

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