2008-09-20 29 views
14

क्यों ग मानक एक memswap समारोह है, जो शायद लगेगा की तरह नहीं है नहीं है:क्यों दिया गया मानक memswap समारोह

int memswap(void *ptr1, void *ptr2, size_t nbytes)? 

मैं जानता हूँ कि यह लिखना आसान होगा, लेकिन मुझे लगता है कि libc कुछ गतिशीलताओं की तरह इसे गति देने के लिए कुछ भयानक चाल कर सकता है यह memcpy के लिए करते हैं।

उत्तर

6

यह ऐसा कुछ नहीं है जो नियमित रूप से आवश्यक है।

विचारों पर विचार किया जा सकता है और त्याग दिया जा सकता है क्योंकि सामान्य उद्देश्य के लिए एल्गोरिदम के साथ आने में काफी मुश्किल है। यह मत भूलना कि सी एक पुरानी भाषा है और एक्सटेंशन को आम तौर पर उपयोगी होना चाहिए।

संभावित त्रुटि की स्थिति: -

  • व्यवहार जब पर्वतमाला
  • शून्य
  • स्मृति से बाहर चल रहा है की लंबाई ओवरलैप बदली जा रहा है (एक इष्टतम कार्यान्वयन स्मृति को आबंटित हो सकता है ऐसा करने के लिए)
  • अशक्त सूचक

सर्वोत्तम एल्गोरिथ एम आप जो भी कर रहे हैं उस पर भी निर्भर हो सकता है, और इसलिए आपके द्वारा सीधे कोड किया जा सकता है।

  • संरचनाओं जल्दी एक अस्थायी संरचना और काम
  • छोटी लंबाई का उपयोग कर जाने की संभावना गमागमन - खंड स्वैप (जहां खंड कुछ इष्टतम लंबाई है) द्वारा 'अनुभाग' - बेहतर अस्थायी स्मृति आवंटन किया जा सकता है
  • लंबे लंबाई
  • हार्डवेयर प्रतिलिपि कार्यों के उपयोग
+3

सर्वश्रेष्ठ एल्गोरिदम आपके लिए आवश्यक नहीं है।जीसीसी में एक कीवर्ड के रूप में 'यादृच्छिक' है, और यह कि आप किस चीज को याद कर रहे हैं, उसके आधार पर, यह फ़ंक्शन कॉल छोड़ सकता है, या लूप के लिए एक अनलॉक हो सकता है, या इन दिनों कंप्यूटर्स स्मार्ट हैं। – Claudiu

+0

खैर, उनमें से प्राकृतिक परिणाम हैं: ओवरलैप -> यूबी, लंबाई == 0 -> नो-ऑप, संभवतया एक निश्चित मात्रा में स्टैक, नल-पॉइंटर -> यूबी का उपयोग करके होना चाहिए। वहां किसी भी तरह से आश्चर्यजनक नहीं है। – Deduplicator

+0

मैं मानता हूं कि सर्वश्रेष्ठ एल्गोरिदम आप जो कर रहे हैं उस पर निर्भर कर सकते हैं, लेकिन आप गतिशील बफर के बिना यह 'memswap' फ़ंक्शन भी लिख सकते हैं, char-by-char (sizeof (char) = 1byte) – Zorgatone

2

शायद क्योंकि इसकी अक्सर आवश्यकता नहीं है - मैं अक्सर याद करता हूं और यादगार रूप से याद करता हूं, लेकिन मुझे नहीं पता कि अगर मैं उपलब्ध था तो मैंने कभी भी memswap का उपयोग किया होगा।

10

मुझे लगता है क्योंकि इसकी अक्सर आवश्यकता नहीं होती है। हालांकि, वहाँ सी में यह करने के लिए एक आसान तरीका ++ है:

#include <algorithm> 

swap_ranges(ptr1, ptr1 + nbytes, ptr2) 

यह यह काफी के रूप में में बनाया गया एक संकलक के रूप में अनुकूलित नहीं किया जा सकता है, लेकिन यह तेजी से एक पाश आप खुद के लिए लिखने की तुलना में किया जा रहा है की क्षमता है, चूंकि इसमें प्लेटफॉर्म विशिष्ट अनुकूलन हो सकता है जिसे आप कार्यान्वित नहीं करेंगे।

आपको उपर्युक्त से सावधान रहने की आवश्यकता है, क्योंकि यह मानता है कि पीआरटी 1 और पीआरटी 2 चार पॉइंटर्स हैं। यह करने के लिए अधिक विहित तरीका है:

#include <algorithm> 

swap_ranges(ptr1, ptr1 + num_items, ptr2) 
2

यह शायद सी में, सी प्रोग्रामिंग में बहुत बार की आवश्यकता नहीं है ++ जहां स्वैप वर्ग के सदस्यों पर करने के लिए एक नियमित रूप से बात नहीं है std::swap एल्गोरिथ्म जो अत्यधिक के लिए अनुकूलित है है विभिन्न प्रकार।

-2

आप पट्टी पर ध्यान दिया है?

मैन swab

+2

हां, लेकिन वह फ़ंक्शन कुछ और करता है। यह पहली सरणी की सामग्री को दूसरी ओर कॉपी करता है और एक ही समय में बाइट ऑर्डर को स्वैप करता है। – quinmars

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