2012-01-28 17 views
9

मैं memmove() के उपयोग के बारे में दो संदेह है:सी का उपयोग कैसे करें और सी में memmove का अच्छा उपयोग कब होता है?

  • बेहतर उपयोग इस समारोह के बजाय उपयोग अन्य समारोह है (यानी एक स्वयं समारोह बनाई गई) कब? मुझे यकीन नहीं है कि मैं ठीक से समझ गया हूं।
  • फ़ंक्शन का हस्ताक्षर शून्य * memmove (शून्य * dest, const void * src, size_t n) है। अगर मेरे पास एक साधारण सरणी arr [N] है, तो मैं इसे बुलाए गए फ़ंक्शन में कैसे डाल सकता हूं? एआर [एन] या & एआर [एन]? अंतर यह है कि अगर सरणी को प्रारंभिक आकार या पॉइंटर की तरह घोषित किया जाता है? मुझे यह संदेह है क्योंकि मैंने कई उदाहरण देखा जहां दोनों का उपयोग किया जाता है।

मुझे आशा है कि मैंने अपने संदेहों को एक अच्छे तरीके से समझाया।

संपादित करें: मुझे सरणी से एक तत्व को हटाना है, और फिर मैं बाईं ओर हटाए गए एक के निम्नलिखित तत्वों को स्थानांतरित करना चाहता हूं।

+1

प्रासंगिक। http://stackoverflow.com/questions/1960991/which-one-to-use-memmove-or-memcpy-when-buffers-dont-overlap –

उत्तर

13
  1. memmove तेजी से हो सकता है लेकिन यह शायद आसपास डेटा की प्रतिलिपि (यह आम तौर पर सावधानी से गढ़ी विधानसभा में कोडित है वर्तमान वास्तुकला पर सबसे कारगर तरीका में चारों ओर सामान ले जाने के लिए संभव हो) के लिए अपने स्वयं के समारोह की तुलना में धीमी कभी नहीं होगा;
  2. यह उस सरणी के साथ आप क्या करना चाहते हैं इस पर निर्भर करता है ... यदि आप अपनी सामग्री को किसी अन्य सरणी में कॉपी करना चाहते हैं arr पर्याप्त होगा (और, लंबाई पैरामीटर के रूप में, आपको sizeof(*arr)*N करना चाहिए जहां एन तत्वों की संख्या है प्रतिलिपि)।

वैसे, अगर स्रोत और गंतव्य और प्रतिलिपि nonoverlapping memcpy तेज हो सकती है।

मैं सरणी से एक तत्व को हटाना चाहता हूं और उसी सरणी के तत्व को छोड़ना चाहता हूं।

int arr[N]; 
/* ... */ 
/* Let's say you want to remove the element i (error checking on i omitted) */ 
memmove(arr+i, arr+i+1, (N-i-1)*sizeof(*arr)); 
/* or, if you prefer array indexing over pointer arithmetics: */ 
memmove(&arr[i], &arr[i+1], (N-i-1)*sizeof(*arr)); 

(sizeof(*arr) का अर्थ है "सरणी के एक तत्व के आकार मिलता है")

+0

मैं सरणी से एक तत्व को हटाना चाहता हूं और शिफ्ट के तत्व को छोड़ना चाहता हूं एक ही सरणी – Kyrol

+1

@Kyrol: अद्यतन उत्तर। –

+2

नोट गैर-ओवरलैपिंग डेटा के लिए केवल 'memcpy' तेज हो सकता है; 'memcpy' का उपयोग करके दस्तावेज़ भी कार्य करता है कि आप एकल ऑब्जेक्ट ऑब्जेक्ट के भीतर तत्वों को स्थानांतरित करने के बजाय अलग-अलग ऑब्जेक्ट्स के बीच प्रतिलिपि बना रहे हैं। –

0

जब बेहतर उपयोग उपयोग की बजाय किसी अन्य समारोह इस समारोह है (यानी एक स्वयं समारोह बनाई गई)

यह "निर्मित स्वयं फ़ंक्शन" से तेज़ है।

फ़ंक्शन का हस्ताक्षर शून्य है * memmove (शून्य * dest, const void * src, size_t n) शून्य है। अगर मेरे पास एक सरल सरणी arr [N] है, तो मैं इसे बुलाए गए फ़ंक्शन में कैसे रख सकता हूं? आगमन [N] या & आगमन [N]

बस arr?

+0

आपने मेरे दूसरे प्रश्न के बारे में क्या नहीं समझा ?? मैं मुझे बेहतर समझाने की कोशिश करता हूं। उदाहरण के लिए – Kyrol

4

memmove गंतव्य और स्रोत सरणी को छोड़कर memcpy की तरह है।

memcpy के साथ आप वादा करते हैं कि क्षेत्र ओवरलैपिंग नहीं कर रहे हैं जो कार्यान्वयन को कुछ अतिरिक्त अनुकूलन करने की अनुमति देता है।तो memcpymemmove से तेज़ हो सकता है।

memmove फ़ंक्शन void * गंतव्य तर्क और const void * स्रोत तर्क लेता है। इसका मतलब है कि आप फ़ंक्शन को सरणी प्रकार के गंतव्य और स्रोत तर्क के साथ कॉल कर सकते हैं क्योंकि उन्हें सूचक प्रकार में परिवर्तित कर दिया जाएगा। और जब आप किसी भी गैर-योग्य ऑब्जेक्ट पॉइंटर प्रकार को void * या const void * पर असाइन कर सकते हैं, तो फ़ंक्शन को कॉल करते समय आपको किसी भी कलाकार की आवश्यकता नहीं होगी।

char src[1024] = {0}; 
char dst[1024]; 

memmove(dst, src, sizeof dst); 
/* src and dst don't overlap you should choose memcpy instead */ 
memcpy(dst, src, sizeof dst); 

अब यह आम तौर पर memcpy या memmove उपयोग करने के लिए की तुलना में अपने खुद के समारोह कोड करने के लिए बेहतर है। उदाहरण के लिए ग्लिब में, एमसीयू निर्देश सेट और कॉपी करने के आकार के आधार पर, memcpy को memcpy के कुछ तेज़ इनलाइन असेंबली संस्करणों के साथ कंपाइलर द्वारा प्रतिस्थापित किया जा सकता है।

+0

+1। धन्यवाद। – Kyrol

+0

और यदि src और dst एक ही सरणी हैं ?? क्योंकि संदेह यह है कि अगर मुझे एक तत्व को हटाना है और हटाए गए एक के बाद अन्य तत्वों को छोड़ दिया है। – Kyrol

+0

@Kyrol: अभी भी 'char src [1024] = {0} 'उदाहरण के साथ। 'memcpy (src, src + 512, 512); 'एक ही ऑब्जेक्ट लेकिन क्षेत्र ओवरलैप नहीं होते हैं: यह ठीक है। लेकिन 'memcpy (src + 256, src + 512, 512);' क्षेत्र ओवरलैप, यह ठीक नहीं है, इसके बजाय 'memmove' का उपयोग करें। – ouah

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